这个问题问const
是否意味着线程安全,Herb Sutter的你不知道const
和mutable
谈话回答得很好。但是相反的方向呢?如果一个函数是线程安全的,那么它是否应该被标记为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;
};
不应将其标记为const
,因为可见状态已更改。 对于该类的用户来说,他们可以将const Counter&
对象传递给函数并且该函数可以更改对象的可见状态,这会让该类的用户感到惊讶。