C 中不可移动互斥体的线程安全可移动性
在 C 中处理可移动类型(例如 std::mutex)时线程安全编程可能具有挑战性。默认情况下,std::mutex 既不可移动也不可复制,阻碍了线程安全可移动对象的创建。
要使包含互斥体的类可移动并保持线程安全,请考虑以下方法:
1。启用可变性:
使互斥体成员可变(例如,可变的 std::mutex mut_;)以允许在移动操作期间进行修改。
2.移动构造函数:
在分配其成员之前锁定要移动的对象的互斥体。这可以防止并发访问导致数据损坏。
A(A&& a) { WriteLock rhs_lk(a.mut_); field1_ = std::move(a.field1_); field2_ = std::move(a.field2_); }
3.移动分配运算符:
使用同步原语保护移动分配。由于可以从多个线程进行访问,因此在执行分配之前锁定左侧 (lhs) 和右侧 (rhs) 互斥锁。
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; }
4.复制成员(可选):
如果还需要复制成员,请使用 ReadLock(而不是 WriteLock)以允许从正在复制的对象进行并发读取。
A(const A& a) { ReadLock rhs_lk(a.mut_); field1_ = a.field1_; field2_ = a.field2_; }
5 。其他注意事项:
通过遵循这些准则,即使使用不可移动互斥体,您也可以确保可移动类保持线程安全。
以上是如何使具有不可移动互斥体的 C 类既可移动又线程安全?的详细内容。更多信息请关注PHP中文网其他相关文章!