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_); }
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 Pembina:
A(const A& a) { ReadLock rhs_lk(a.mut_); field1_ = a.field1_; field2_ = a.field2_; }
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; }
Pertimbangan Lain:
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!