在 C 中处理可移动类型中的互斥体
问题:
由于非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中文网其他相关文章!