首页 >后端开发 >C++ >如何安全地移动包含'std::mutex”的 C 类型?

如何安全地移动包含'std::mutex”的 C 类型?

Barbara Streisand
Barbara Streisand原创
2024-11-30 08:11:10811浏览

How to Safely Move C   Types Containing `std::mutex`?

处理可移动 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;
}

其他注意事项:

  • 在C中可以通过共享互斥体来优化复制成员14.
  • 使用锁定机制保护修改 A 状态的其他方法。
  • 通过在交换之前检查相等性来防止自交换。
  • 考虑使用 read 和写入锁定数据成员以避免复制/移动构造函数中的默认构造。

以上是如何安全地移动包含'std::mutex”的 C 类型?的详细内容。更多信息请关注PHP中文网其他相关文章!

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