Movable C 型でのミューテックスの処理
概要:
C では、移動セマンティクスが強化されていますコピーせずに型を効率的に移動できるようにすることで効率を高めます。ただし、標準のミューテックス (std::mutex) は移動可能でもコピー可能でもないため、ミューテックスを活用する移動対応型の実装には課題が生じます。
問題:
ミューテックスを含むクラス (A) をスレッドセーフで移動可能にするにはどうすればよいですか方法?
解決策:
移動可能にするには、ロック タイプ (ReadLock および WriteLock) を共有ロックまたは一意のロックのエイリアスとして定義します。これらの型を利用して、移動関連操作内のメンバー アクセスを保護します。
移動コンストラクター:
A(A&& a) { WriteLock rhs_lk(a.mut_); field1_ = std::move(a.field1_); 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_); field1_ = a.field1_; 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; }
その他の考慮事項:
以上が`std::mutex` を含む C 型を安全に移動するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。