首页 >后端开发 >C++ >如何使具有不可移动互斥体的 C 类既可移动又线程安全?

如何使具有不可移动互斥体的 C 类既可移动又线程安全?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-05 19:22:18727浏览

How Can I Make My C   Classes with Non-Movable Mutexes Both Movable and Thread-Safe?

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 。其他注意事项:

  • 通过适当的同步保护访问类状态的其他成员函数和自由函数,以维护线程安全。
  • 考虑使用 std::shared_timed_mutex 或其他高级同步类型以针对 C 14 及更高版本中的特定场景进行优化。

通过遵循这些准则,即使使用不可移动互斥体,您也可以确保可移动类保持线程安全。

以上是如何使具有不可移动互斥体的 C 类既可移动又线程安全?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn