线程安全是否意味着 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&
对象传递给一个函数,并且对象的可见状态可以被该函数更改。
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&
对象传递给一个函数,并且对象的可见状态可以被该函数更改。