问题:
标准库互斥体 (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中文网其他相关文章!