线程安全是否意味着 c++11/14 中的常量



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

最新更新