Mengendalikan Muteks dalam Jenis Alih dalam C
Isu:
Disebabkan bukan- sifat std::mutex yang boleh disalin dan tidak boleh alih, kelas yang memegang mutex tidak mempunyai pergerakan lalai pembina, menjadikannya mencabar untuk mencipta jenis selamat benang alih.
Penyelesaian:
Untuk mencapai semantik pergerakan selamat benang untuk kelas A yang memegang mutex, pakai yang berikut strategi:
Bergerak Pembina:
A(A&& a) { WriteLock rhs_lk(a.mut_); // Lock the rhs mutex field1_ = std::move(a.field1_); // Move the data field2_ = std::move(a.field2_); }
Operator Tugasan Alih:
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_); // Lock the rhs mutex for reading field1_ = a.field1_; // Copy the data field2_ = a.field2_; }
Salin Tugasan Operator:
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 Bagaimanakah Saya Boleh Jadikan Kelas C Saya dengan Mutex Boleh Alih dan Selamat Benang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!