使用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 (将#修改为@)