2015-04-22 33 views
1

This question询问const是否意味着线程安全,其中Herb Sutter的You don't know const and mutable对话很好。但是相反的方向呢?如果一个函数是线程安全的,它是否应该被标记为const?如果不是,什么时候应该标记const在C++ 11/14中线程安全是否意味着const?

+0

通过提供适当的同步机制,您可以轻松构建修改状态并且仍然是线程安全的函数。它不一定非得是'const',除非我完全误解了你的问题 – Alejandro

回答

1

不,这是完全可能的方法是非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&对象传递给一个函数,并且该对象的可见状态可以被该函数改变。

+0

这也是我结束的地方。看来谈话的真正教训是“const的东西应该在逻辑上是const并且是线程安全的”,而不仅仅是“const应该是线程安全的” –