如何解决使用const ==线程安全是一种不好的做法
我刚刚听过talk这个关于const
在c ++ 11之内和之后实际上意味着位不变的OR线程安全的说法。此外,我们应该保证const函数是线程安全的。在我尝试实施之前,一切都很好。看这个例子:
class Foo {
public:
void increment() const {
std::lock_guard<std::mutex> lk(m);
hiddenVal+=1;
}
private:
std::mutex m;
int hiddenVal=0;
};
该代码实际上将不会编译,因为即使函数是线程安全的,我们也正在修改成员变量。因此,最终要使该函数真正有效,我们必须像这样声明变量:
mutable std::mutex m;
mutable int hiddenVal=0;
现在,我同意mutex
本质上是线程安全的,因此将其设为mutable
是有意义的,但是hiddenVal
绝对不是线程安全的,因此我们为什么也必须使其安全mutable
?
现在想象一下更大的规模。从const
函数调用的每个函数也必须为const
。在const
函数中修改的每个变量都必须为mutable
。老实说,这似乎是一种反模式。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。