处理可移动 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中文网其他相关文章!