首頁 > 後端開發 > C++ > 如何為包含互斥體的類別實作執行緒安全的移動語意?

如何為包含互斥體的類別實作執行緒安全的移動語意?

Barbara Streisand
發布: 2024-11-27 20:47:12
原創
906 人瀏覽過

How to Implement Thread-Safe Move Semantics for Classes Containing Mutexes?

包含互斥體的物件的執行緒安全移動語意

問題:

標準庫互斥體(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中文網其他相關文章!

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