Masalah:
Mutex perpustakaan standard (std::mutex) tidak boleh disalin mahupun alih, menyebabkan ketiadaan pembina langkah lalai untuk kelas yang mengandungi mutex. Ini menimbulkan cabaran untuk mencapai jenis alih dengan cara selamat benang.
Penyelesaian:
Untuk menjadikan kelas yang mengandungi mutex boleh alih sambil memastikan keselamatan benang, perkara berikut langkah boleh diambil:
class A { using MutexType = std::mutex; using ReadLock = std::unique_lock<MutexType>; using WriteLock = std::unique_lock<MutexType>; mutable MutexType mut_; // Other member variables... };
Bergerak Pembina:
A(A&& a) { WriteLock rhs_lk(a.mut_); // Copy or move member variables under rhs_lk protection. }
Alih 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); // Copy or move member variables under combined lock. } return *this; }
Salin Pembina:
A(const A& a) { ReadLock rhs_lk(a.mut_); // Copy member variables under rhs_lk protection. }
Salin Tugasan:
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); // Copy member variables under combined lock. } return *this; }
Operasi pemindahan dan penyalinan selamat benang ini mengekalkan integriti mutex dan membenarkan pengubahsuaian yang boleh dipercayai dan akses kepada pembolehubah ahli di bawah perlindungan kunci.
Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Semantik Alih Selamat Benang untuk Kelas yang Mengandungi Mutex?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!