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 。追加の考慮事項:
これらのガイドラインに従うことで、移動不可能なミューテックスを使用している場合でも、移動可能なクラスをスレッドセーフに保つことができます。
以上が移動不可能なミューテックスを持つ C クラスを移動可能かつスレッドセーフにするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。