問題:
標準ライブラリのミューテックス (std::mutex)コピーも移動もできないため、ミューテックスを含むクラスにはデフォルトの移動コンストラクターが存在しません。これは、スレッド セーフな方法で可動型を実現する上で課題となります。
解決策:
スレッド セーフを確保しながらミューテックスを含むクラスを可動にするには、次のようにします。実行できる手順:
class A { using MutexType = std::mutex; using ReadLock = std::unique_lock<MutexType>; using WriteLock = std::unique_lock<MutexType>; mutable MutexType mut_; // Other member variables... };
移動コンストラクター:
A(A&& a) { WriteLock rhs_lk(a.mut_); // Copy or move member variables under rhs_lk protection. }
移動代入:
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); // Copy or move member variables under combined lock. } return *this; }
コピーコンストラクター:
A(const A& a) { ReadLock rhs_lk(a.mut_); // Copy member variables under rhs_lk protection. }
コピー割り当て:
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); // Copy member variables under combined lock. } return *this; }
これらのスレッドセーフな移動およびコピー操作は、ミューテックスの整合性を維持し、ロック保護下で信頼性の高い変更とメンバー変数へのアクセスを可能にします。
以上がミューテックスを含むクラスにスレッドセーフな移動セマンティクスを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。