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

Does thread-safe mean const in c++11/14?

This question asks if const means thread-safe, which Herb Sutter's You don't know const and 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,因为可见状态已更改。 class 的用户会惊讶于他们可以将 const Counter& 对象传递给一个函数,并且对象的可见状态可以被该函数更改。