带有 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 中小部件类的信号函数是不是安全?