ホームページ >バックエンド開発 >C++ >ミューテックスを使用して C クラスを移動可能かつスレッドセーフにするにはどうすればよいですか?

ミューテックスを使用して C クラスを移動可能かつスレッドセーフにするにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-29 06:05:14623ブラウズ

How Can I Make My C   Class with a Mutex Movable and Thread-Safe?

C での Movable Type のミューテックスの処理

問題:

std::mutex のコピー可能かつ移動不可能な性質、ミューテックスを保持するクラスにはデフォルトの移動がありません

解決策:

ミューテックスを保持するクラス A のスレッドセーフな移動セマンティクスを実現するには、以下を採用します。戦略:

移動コンストラクター:

A(A&& a) {
    WriteLock rhs_lk(a.mut_); // Lock the rhs mutex
    field1_ = std::move(a.field1_); // Move the data
    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_); // Lock the rhs mutex for reading
    field1_ = a.field1_; // Copy the data
    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;
}

その他の考慮事項:

  • 便宜上、ReadLock および WriteLock タイプのエイリアスを定義します。
  • 必ず次のことを行ってください。移動代入演算子を回避するには、std::lock を使用して両方のミューテックスをロックします。デッドロック。
  • 同時読み取りを可能にするために、C 14 で std::shared_timed_mutex を使用することを検討してください。
  • 適切なミューテックス ロックを使用して、クラス A の内部状態にアクセスするメンバー関数または解放関数を保護します。
  • 必要に応じて、ReadLock オブジェクトと WriteLock オブジェクトを格納するデータ メンバー ロックを追加して、デフォルトのメンバー構築を回避します。コピー中。

以上がミューテックスを使用して C クラスを移動可能かつスレッドセーフにするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。