C++ C++;具有const函数的线程安全

C++ C++;具有const函数的线程安全,c++,multithreading,thread-safety,const-correctness,C++,Multithreading,Thread Safety,Const Correctness,因此,我有一个数据结构,它使用rBlock确保线程安全。我有一个RAII ScopedRWLock,它在创建时锁定,在析构函数时解锁。对于访问器函数,我有: int GetValue() const { ScopedRWLock read_lock(&m_rwlock); return m_value; } 现在这不起作用了,因为编译器抱怨ScopedRWLock带有const。我尝试用普通读取锁定和读取解锁替换ScopedRWLock,但都不起作用。所以问题是,人们如

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

int GetValue() const
{
    ScopedRWLock read_lock(&m_rwlock);
    return m_value;
}
现在这不起作用了,因为编译器抱怨ScopedRWLock带有const。我尝试用普通读取锁定和读取解锁替换ScopedRWLock,但都不起作用。所以问题是,人们如何在实现常量正确性的同时实现常规(非无锁)线程安全性


谢谢

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

int GetValue() const
{
    ScopedRWLock l(&m_rwlock);
    return m_value;
}
现在,在访问
m_值
之前,锁仍在作用域内


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

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

int GetValue() const
{
    ScopedRWLock l(&m_rwlock);
    return m_value;
}
现在,在访问
m_值
之前,锁仍在作用域内


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

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

int GetValue() const
{
    ScopedRWLock l(&m_rwlock);
    return m_value;
}
现在,在访问
m_值
之前,锁仍在作用域内


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

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

int GetValue() const
{
    ScopedRWLock l(&m_rwlock);
    return m_value;
}
现在,在访问
m_值
之前,锁仍在作用域内


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

您可能想将
m_rBlock
声明为
mutable
,因此即使使用const
this
,它也是非常量的。您可能想将
m_rBlock
声明为
mutable
,因此,即使使用const
this
,它也是非常量的。你可能想将你的
m_rBlock
声明为
mutable
,所以即使使用const
this
,它也是非常量的。你可能想将你的
m_rBlock
声明为
mutable
,所以即使使用const
this
,它也是非常量的。该死。就在我的答案准备好的时候,你把答案添加到了你的帖子里。做得好。是的,这是动态代码,是的,我正在正确创建实例,我将修复上面的帖子。。。虽然是可变的,但这是唯一的方法吗?@user1181950这不是唯一的方法。另一种方法是创建一个lock holder对象,其构造函数采用const引用并使用该lock holder对象。就在我的答案准备好的时候,你把答案添加到了你的帖子里。做得好。是的,这是动态代码,是的,我正在正确创建实例,我将修复上面的帖子。。。虽然是可变的,但这是唯一的方法吗?@user1181950这不是唯一的方法。另一种方法是创建一个lock holder对象,其构造函数采用const引用并使用该lock holder对象。就在我的答案准备好的时候,你把答案添加到了你的帖子里。做得好。是的,这是动态代码,是的,我正在正确创建实例,我将修复上面的帖子。。。虽然是可变的,但这是唯一的方法吗?@user1181950这不是唯一的方法。另一种方法是创建一个lock holder对象,其构造函数采用const引用并使用该lock holder对象。就在我的答案准备好的时候,你把答案添加到了你的帖子里。做得好。是的,这是动态代码,是的,我正在正确创建实例,我将修复上面的帖子。。。虽然是可变的,但这是唯一的方法吗?@user1181950这不是唯一的方法。另一种方法是创建一个锁持有者对象,其构造函数接受常量引用并使用该锁持有者对象。