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