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应该是线程安全的”