首頁 > 後端開發 > C++ > 如何安全地移動包含'std::mutex”的 C 類型?

如何安全地移動包含'std::mutex”的 C 類型?

Barbara Streisand
發布: 2024-11-30 08:11:10
原創
809 人瀏覽過

How to Safely Move C   Types Containing `std::mutex`?

處理可移動C 類型中的互斥體

概述:

概述:

在中,移動語義增強透過允許在不複製的情況下有效地移動類型來提高效率。但是,標準互斥體 (std::mutex) 既不可移動也不可複製,這對實現利用互斥體的支援移動的類型構成了挑戰。

問題:

如何使包含互斥鎖的類別(A) 在線程安全中可移動

解決方案:

要啟用可移動性,請將鎖定類型(ReadLock 和WriteLock)定義為共享鎖或唯一鎖的別名。利用這些類型來保護與移動相關的操作中的成員存取。

A(A&& a) {
    WriteLock rhs_lk(a.mut_);
    field1_ = std::move(a.field1_);
    field2_ = std::move(a.field2_);
}
登入後複製

移動建構子:

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;
}
登入後複製

移動賦值運算子:

A(const A& a) {
    ReadLock rhs_lk(a.mut_);
    field1_ = a.field1_;
    field2_ = a.field2_;
}
登入後複製

複製建構子:

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;
}
登入後複製

複製賦值運算子:

  • 注意事項:
  • 在C中可以透過共享互斥體來最佳化複製成員14.
  • 使用鎖定機制保護修改 A 狀態的其他方法。
透過在交換之前檢查相等性來防止自交換。 考慮使用 read 和寫入鎖定資料成員以避免複製/移動建構函式中的預設建構。

以上是如何安全地移動包含'std::mutex”的 C 類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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