ホームページ > バックエンド開発 > C++ > ミューテックスを含むクラスにスレッドセーフな移動セマンティクスを実装するにはどうすればよいですか?

ミューテックスを含むクラスにスレッドセーフな移動セマンティクスを実装するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-11-27 20:47:12
オリジナル
862 人が閲覧しました

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート