Berurusan dengan Mutex dalam Jenis Alih dalam C
Seperti yang anda nyatakan, std::mutex tidak boleh dialihkan mahupun boleh disalin, memberikan cabaran apabila bekerja dengan kelas yang memegang mutex. Untuk membuat jenis boleh alih sambil mengekalkan keselamatan benang, pertimbangkan pendekatan berikut:
Buat pembina bergerak yang mengunci muteks objek yang dialihkan daripada (a) menggunakan WriteLock:
A(A&& a) { WriteLock rhs_lk(a.mut_); field1_ = std::move(a.field1_); field2_ = std::move(a.field2_); }
Pengendali tugasan pindah adalah lebih rumit, seperti yang lain benang mungkin mengakses sama ada lhs atau rhs 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; }
Jika anda perlu menyokong semantik salinan, buat pembina salinan yang mengunci mutex objek yang sedang disalin daripada (a) menggunakan ReadLock:
A(const A& a) { ReadLock rhs_lk(a.mut_); field1_ = a.field1_; field2_ = a.field2_; }
Jika anda juga memerlukan operator tugasan salinan, ikut corak yang serupa:
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; }
Melindungi ahli dan fungsi percuma yang mengakses keadaan kelas adalah penting untuk keselamatan benang. Sebagai contoh, berikut ialah fungsi swap:
friend void swap(A& x, A& y) { if (&x != &y) { WriteLock lhs_lk(x.mut_, std::defer_lock); WriteLock rhs_lk(y.mut_, std::defer_lock); std::lock(lhs_lk, rhs_lk); using std::swap; swap(x.field1_, y.field1_); swap(x.field2_, y.field2_); } }
Akhir sekali, ingat bahawa std::shared_timed_mutex dalam C 14 membenarkan pengoptimuman yang mungkin dalam situasi di mana beberapa utas cuba membina-salin daripada objek yang sama.
Atas ialah kandungan terperinci Bagaimana untuk Membuat Jenis Alih dengan Mutex Dalaman dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!