問題:
標準庫互斥體(std ::mutex)既不可複製也不可移動,導致包含以下內容的類別缺少預設的移動建構子互斥體。這對以線程安全的方式實現可移動類型提出了挑戰。
解決方案:
要使包含互斥體的類可移動,同時確保線程安全,以下可以採取的步驟:
class A { using MutexType = std::mutex; using ReadLock = std::unique_lock<MutexType>; using WriteLock = std::unique_lock<MutexType>; mutable MutexType mut_; // Other member variables... };
移動建構子:
A(A&& a) { WriteLock rhs_lk(a.mut_); // Copy or move member variables under rhs_lk protection. }
移動賦值:
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; }
複製建構子>
A(const A& a) { ReadLock rhs_lk(a.mut_); // Copy member variables under rhs_lk protection. }
複製建構子>
複製賦值: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; }這些執行緒安全的移動和複製操作保留互斥鎖的完整性,並允許在鎖定保護下可靠地修改和存取成員變數。
以上是如何為包含互斥體的類別實作執行緒安全的移動語意?的詳細內容。更多資訊請關注PHP中文網其他相關文章!