【问题标题】:C++ thread safety with const functions带有 const 函数的 C++ 线程安全
【发布时间】: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 也是非常量。

标签: c++ multithreading thread-safety const-correctness


【解决方案1】:

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

int GetValue() const
{
    ScopedRWLock l(&m_rwlock);
    return m_value;
}

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

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

【讨论】:

  • 该死的。当我的准备就绪时,您将答案添加到您的帖子中。干得好。
  • 是的,那是动态代码,是的,我正在正确创建实例,我会修复上面的帖子......虽然关于可变,但这是唯一的方法吗?
  • @user1181950 这不是唯一的方法。另一种方法是创建一个锁持有者对象,其构造函数采用 const 引用并使用该锁持有者对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-15
  • 2012-12-17
相关资源
最近更新 更多