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

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

Barbara Streisand
Barbara Streisand原創
2024-11-27 20:47:12844瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn