首頁 > 後端開發 > C++ > 如何使具有不可移動互斥體的 C 類別既可移動又線程安全?

如何使具有不可移動互斥體的 C 類別既可移動又線程安全?

Mary-Kate Olsen
發布: 2024-12-05 19:22:18
原創
724 人瀏覽過

How Can I Make My C   Classes with Non-Movable Mutexes Both Movable and Thread-Safe?

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 。其他注意事項:

  • 透過適當的同步保護存取類別狀態的其他成員函數和自由函數,以維護執行緒安全性。
  • 考慮使用 std::shared_timed_mutex 或其他進階同步類型以針對 C 14 及更高版本中的特定場景進行最佳化。

遵循這些準則,即使使用不可移動互斥體,您也可以確保可移動類別保持執行緒安全。

以上是如何使具有不可移動互斥體的 C 類別既可移動又線程安全?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板