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

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

Mary-Kate Olsen
リリース: 2024-12-05 19:22:18
オリジナル
725 人が閲覧しました

How Can I Make My C   Classes with Non-Movable Mutexes Both Movable and Thread-Safe?

C での非可動ミューテックスによるスレッドセーフな移動性

C で std::mutex などの可動型を扱う場合スレッドセーフなプログラミングは難しい場合があります。デフォルトでは、std::mutex は移動可能でもコピー可能でもないため、スレッドセーフな移動可能オブジェクトの作成が妨げられます。

ミューテックスを含むクラスを移動可能にし、スレッドの安全性を維持するには、次のアプローチを検討してください。

1.可変性を有効にする:
移動操作中に変更できるように、ミューテックス メンバーを可変 (例: mutable std::mutex mut_;) にします。

2. Move Constructor:
メンバーを割り当てる前に、移動元のオブジェクトのミューテックスをロックします。これにより、同時アクセスによるデータ破損を防ぎます。

A(A&& a) {
    WriteLock rhs_lk(a.mut_);
    field1_ = std::move(a.field1_);
    field2_ = std::move(a.field2_);
}
ログイン後にコピー

3.移動割り当て演算子:
同期プリミティブを使用して移動割り当てを保護します。複数のスレッドからのアクセスが可能であるため、代入を実行する前に左側 (lhs) と右側 (rhs) の両方のミューテックスをロックしてください。

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;
}
ログイン後にコピー

4.コピー メンバー (オプション):
コピー メンバーも必要な場合は、(WriteLock の代わりに) ReadLock を使用して、コピー元のオブジェクトからの同時読み取りを許可します。

A(const A& a) {
    ReadLock rhs_lk(a.mut_);
    field1_ = a.field1_;
    field2_ = a.field2_;
}
ログイン後にコピー

5 。追加の考慮事項:

  • スレッドの安全性を維持するために、適切な同期を使用してクラス状態にアクセスする他のメンバー関数と解放関数を保護します。
  • std::shared_timed_mutex または別の高度な同期の使用を検討してください。 C 14 の特定のシナリオに最適化するタイプと

これらのガイドラインに従うことで、移動不可能なミューテックスを使用している場合でも、移動可能なクラスをスレッドセーフに保つことができます。

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

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