首页 > 后端开发 > C++ > 如何为包含互斥体的类实现线程安全的移动语义?

如何为包含互斥体的类实现线程安全的移动语义?

Barbara Streisand
发布: 2024-11-27 20:47:12
原创
905 人浏览过

How to Implement Thread-Safe Move Semantics for Classes Containing Mutexes?

包含互斥体的对象的线程安全移动语义

问题:

标准库互斥体 (std::mutex)既不可复制也不可移动,导致包含以下内容的类缺少默认的移动构造函数互斥体。这对以线程安全的方式实现可移动类型提出了挑战。

解决方案:

要使包含互斥体的类可移动,同时确保线程安全,以下可以采取的步骤:

class A
{
    using MutexType = std::mutex;
    using ReadLock = std::unique_lock<MutexType>;
    using WriteLock = std::unique_lock<MutexType>;

    mutable MutexType mut_;
    // Other member variables...
};
登录后复制

移动构造函数:

A(A&& a)
{
    WriteLock rhs_lk(a.mut_);
    // Copy or move member variables under rhs_lk protection.
}
登录后复制

移动赋值:

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);
        // Copy or move member variables under combined lock.
    }
    return *this;
}
登录后复制

复制构造函数:

A(const A& a)
{
    ReadLock rhs_lk(a.mut_);
    // Copy member variables under rhs_lk protection.
}
登录后复制

复制赋值:

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);
        // Copy member variables under combined lock.
    }
    return *this;
}
登录后复制

这些线程安全的移动和复制操作保留互斥锁的完整性,并允许在锁保护下可靠地修改和访问成员变量。

以上是如何为包含互斥体的类实现线程安全的移动语义?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板