Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Mengalihkan Jenis C dengan Selamat yang Mengandungi `std::mutex`?

Bagaimana untuk Mengalihkan Jenis C dengan Selamat yang Mengandungi `std::mutex`?

Barbara Streisand
Lepaskan: 2024-11-30 08:11:10
asal
900 orang telah melayarinya

How to Safely Move C   Types Containing `std::mutex`?

Mengendalikan Mutex dalam Jenis C Movable

Ikhtisar:

Dalam C , gerakkan semantik meningkatkan kecekapan dengan membenarkan jenis dipindahkan dengan cekap tanpa menyalin. Walau bagaimanapun, mutex standard (std::mutex) tidak boleh alih atau boleh disalin, menimbulkan cabaran untuk melaksanakan jenis didayakan alih yang memanfaatkan mutex.

Masalah:

Bagaimanakah kelas (A) yang mengandungi mutex boleh digerakkan dalam peti keselamatan benang cara?

Penyelesaian:

Untuk mendayakan kebolehgerakan, tentukan jenis kunci (ReadLock dan WriteLock) sebagai alias untuk kunci kongsi atau unik. Gunakan jenis ini untuk melindungi akses ahli dalam operasi berkaitan pergerakan.

Move Constructor:

A(A&& a) {
    WriteLock rhs_lk(a.mut_);
    field1_ = std::move(a.field1_);
    field2_ = std::move(a.field2_);
}
Salin selepas log masuk

Move Assignment Operator:

A& operator=(A&& a) {
    if (this != &a) {
        WriteLock lhs_lk(mut_, std::defer_lock);
        WriteLock rhs_lk(a.mut_, std::defer_lock);
        std::lock(lhs_lk, rhs_lk);
        field1_ = std::move(a.field1_);
        field2_ = std::move(a.field2_);
    }
    return *this;
}
Salin selepas log masuk

Salin Pembina:

A(const A& a) {
    ReadLock rhs_lk(a.mut_);
    field1_ = a.field1_;
    field2_ = a.field2_;
}
Salin selepas log masuk

Operator Tugasan Salin:

A& operator=(const A& a) {
    if (this != &a) {
        WriteLock lhs_lk(mut_, std::defer_lock);
        ReadLock rhs_lk(a.mut_, std::defer_lock);
        std::lock(lhs_lk, rhs_lk);
        field1_ = a.field1_;
        field2_ = a.field2_;
    }
    return *this;
}
Salin selepas log masuk

Pertimbangan Lain:

  • Ahli salin boleh dioptimumkan dengan berkongsi mutex dalam C 14.
  • Lindungi kaedah lain yang mengubah suai keadaan A dengan mekanisme penguncian.
  • Berjaga-jaga terhadap pertukaran diri dengan menyemak kesaksamaan sebelum menukar.
  • Pertimbangkan untuk menggunakan baca dan tulis ahli data kunci untuk mengelakkan pembinaan lalai dalam pembina salin/pindah.

Atas ialah kandungan terperinci Bagaimana untuk Mengalihkan Jenis C dengan Selamat yang Mengandungi `std::mutex`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan