我有一个由多个线程读/写的错误状态布尔值。它最初设置为true,如果任何操作失败,则应设置为false。
我想使用按位AND,如此:
std::atomic<bool> status;
status &= func1();
status &= func2();
但operator&=
和std::atomic<bool>
之间不允许bool
。
我已经能够使用std::atomic<int>
作为解决方法来获得相同的结果,但我担心我可能会引入错误。
有没有办法让操作员和工作,或唯一可行的语法使用检查func1()/ func2()的返回值和覆盖状态为假吗?
答案 0 :(得分:2)
在C ++中,true和false分别隐式转换为1和0。因此,在bool
上使用位操作操作很好(如果有点不寻常)。
std::atomic<bool>
不支持按位操作分配,但对于“按位AND和分配”,您可以定义类似的内容:
bool operator&=(atomic<bool> &ab, bool val)
{
bool tmp = ab.load();
if (val == false)
ab.store(false);
return tmp;
}
正如M.M所指出的那样,简单地指定func()
的返回值的后备方案不是线程安全的。
另一个主题可以在false
返回后再次将其设置为true
时将其设置为func()
。