Kebolehgerakan Selamat Benang dengan Mutex Tidak Boleh Alih dalam C
Apabila berurusan dengan jenis alih, seperti std::mutex, dalam C pengaturcaraan selamat benang boleh mencabar. Secara lalai, std::mutex tidak boleh alih dan tidak boleh disalin, menghalang penciptaan objek alih selamat benang.
Untuk menjadikan kelas yang mengandungi mutex boleh alih dan mengekalkan keselamatan benang, pertimbangkan pendekatan berikut:
1. Dayakan Kebolehubahan:
Jadikan ahli mutex boleh berubah (cth., mutable std::mutex mut_;) untuk membenarkan pengubahsuaian semasa operasi pemindahan.
2. Move Constructor:
Kunci muteks objek yang dialihkan sebelum menetapkan ahlinya. Ini menghalang rasuah data daripada akses serentak.
A(A&& a) { WriteLock rhs_lk(a.mut_); field1_ = std::move(a.field1_); field2_ = std::move(a.field2_); }
3. Operator Tugasan Alih:
Lindungi tugasan pindah menggunakan primitif penyegerakan. Memandangkan akses daripada berbilang rangkaian boleh dilakukan, kunci kedua-dua mutex sebelah kiri (lhs) dan sebelah kanan (rhs) sebelum melaksanakan tugasan.
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; }
4. Ahli Salin (Pilihan):
Jika ahli salin juga diperlukan, gunakan ReadLock (bukan WriteLock) untuk membenarkan bacaan serentak daripada objek yang disalin.
A(const A& a) { ReadLock rhs_lk(a.mut_); field1_ = a.field1_; field2_ = a.field2_; }
5 . Pertimbangan Tambahan:
Dengan mengikuti garis panduan ini, anda boleh memastikan kelas alih anda kekal selamat untuk benang walaupun menggunakan mutex tidak boleh alih.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Jadikan Kelas C Saya dengan Mutex Tidak Boleh Alih Kedua-duanya Boleh Alih dan Selamat Benang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!