带有 const 函数的 C++ 线程安全

Posted

技术标签:

【中文标题】带有 const 函数的 C++ 线程安全【英文标题】:C++ thread safety with const functions 【发布时间】:2014-03-29 01:45:05 【问题描述】:

所以我有一个使用 rwlock 确保线程安全的数据结构。我有一个 RAII ScopedRWLock,它在创建时锁定,在析构函数时解锁。所以对于访问器函数,我有:

int GetValue() const

    ScopedRWLock read_lock(&m_rwlock);
    return m_value;

现在这不起作用,因为编译器抱怨 ScopedRWLock 带有 const。我尝试用普通的读取锁定和读取解锁替换 ScopedRWLock ,但也不起作用。那么问题是人们如何在实现 const-correctness 的同时实现常规(非无锁)线程安全??

谢谢

【问题讨论】:

您可能希望将您的 m_rwlock 声明为 mutable,因此即使使用 const this 也是非常量。 【参考方案1】:

您创建了作用域锁,但随后立即将其销毁,因此它无法保护您对m_value 的访问。你想要这个:

int GetValue() const

    ScopedRWLock l(&m_rwlock);
    return m_value;

现在,在访问m_value 之前,锁一直在作用域内。

您可能还想声明锁mutable,以便可以在const 成员函数中访问它。

【讨论】:

该死的。当我的准备就绪时,您将答案添加到您的帖子中。干得好。 是的,那是动态代码,是的,我正在正确创建实例,我会修复上面的帖子......虽然关于可变,但这是唯一的方法吗? @user1181950 这不是唯一的方法。另一种方法是创建一个锁持有者对象,其构造函数采用 const 引用并使用该锁持有者对象。

以上是关于带有 const 函数的 C++ 线程安全的主要内容,如果未能解决你的问题,请参考以下文章

在线程中使用 std::string 函数是不是安全? (c++)

从 C++ 中的多个线程调用 Qt 中小部件类的信号函数是不是安全?

这段代码安全吗,可以从构造函数 C++ 生成线程吗?

为啥 QPainterPath::contains() 尽管是 const 却不是线程安全的?

const是多线程安全的吗

线程安全堆栈 C++ 中的潜在死锁