C++11 线程安全是否意味着c++;11/14?

C++11 线程安全是否意味着c++;11/14?,c++11,thread-safety,constants,C++11,Thread Safety,Constants,询问const是否意味着线程安全,Herb Sutter的谈话对此回答得很好。但是相反的方向呢?如果一个函数是线程安全的,那么它是否应该因此被标记为const?如果不是,什么时候应该将函数标记为const?否,方法完全可能是非const,但仍然是线程安全的。它要么使用原子,要么使用锁来保护成员变量。例如,下面的count()方法是线程安全的,同时修改m_count成员变量 #include <iostream> #include <mutex> class Counte

询问
const
是否意味着线程安全,Herb Sutter的谈话对此回答得很好。但是相反的方向呢?如果一个函数是线程安全的,那么它是否应该因此被标记为
const
?如果不是,什么时候应该将函数标记为
const

否,方法完全可能是非
const
,但仍然是线程安全的。它要么使用原子,要么使用锁来保护成员变量。例如,下面的
count()
方法是线程安全的,同时修改
m_count
成员变量

#include <iostream>
#include <mutex>

class Counter
{
public:
    Counter() : m_counterMutex(), m_counter(0) {}
    unsigned int count() {
        std::lock_guard<std::mutex> lk(m_counterMutex);
        ++m_counter;
        return m_counter;
    }
private:
    std::mutex m_counterMutex;
    unsigned int m_counter;

};
#包括
#包括
班级计数器
{
公众:
计数器():m_counterMutex(),m_计数器(0){}
无符号整数计数(){
std::lock_guard lk(m_counterMutex);
++m_计数器;
返回m_计数器;
}
私人:
std::mutex m_counterMutex;
无符号整数m_计数器;
};

不应将其标记为
const
,因为可见状态已更改。该类的用户可能会感到惊讶,因为他们可以将
常量计数器&
对象传递给函数,并且该函数可以更改对象的可见状态。

通过提供适当的同步机制,您可以轻松构造修改状态且仍然是线程安全的函数。它不一定是常量,除非我完全误解了你的问题,这也是我的结局。这场演讲的真正教训似乎是“const事物应该是逻辑上的const和线程安全的”,而不仅仅是“const应该是线程安全的”