C 中不可移動互斥體的線程安全可移動性
在C 中處理可移動類型(例如std::mutex )時線程安全編程可能具有挑戰性。預設情況下,std::mutex 既不可移動也不可複製,阻礙了線程安全可移動物件的建立。
要讓包含互斥體的類別可移動並保持執行緒安全,請考慮以下方法:
1。啟用可變性:
使互斥體成員可變(例如,可變的 std::mutex mut_;)以允許在移動操作期間進行修改。
2.移動建構子:
在分配其成員之前鎖定要移動的物件的互斥體。這可以防止並發存取導致資料損壞。
A(A&& a) { WriteLock rhs_lk(a.mut_); field1_ = std::move(a.field1_); field2_ = std::move(a.field2_); }
3.移動分配運算子:
使用同步原語保護移動分配。由於可以從多個執行緒進行訪問,因此在執行分配之前鎖定左側 (lhs) 和右側 (rhs) 互斥鎖。
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; }
4.複製成員(可選):
如果還需要複製成員,請使用ReadLock(而不是WriteLock)以允許從正在複製的物件進行並發讀取。
A(const A& a) { ReadLock rhs_lk(a.mut_); field1_ = a.field1_; field2_ = a.field2_; }
5 。其他注意事項:
遵循這些準則,即使使用不可移動互斥體,您也可以確保可移動類別保持執行緒安全。
以上是如何使具有不可移動互斥體的 C 類別既可移動又線程安全?的詳細內容。更多資訊請關注PHP中文網其他相關文章!