按位AND与std :: atomic <bool>

时间:2017-01-20 09:54:09

标签: c++11 boolean atomic

我有一个由多个线程读/写的错误状态布尔值。它最初设置为true,如果任何操作失败,则应设置为false。

我想使用按位AND,如此:

std::atomic<bool> status;

status &= func1();
status &= func2();

operator&=std::atomic<bool>之间不允许bool

我已经能够使用std::atomic<int>作为解决方法来获得相同的结果,但我担心我可能会引入错误。

有没有办法让操作员和工作,或唯一可行的语法使用检查func1()/ func2()的返回值和覆盖状态为假吗?

1 个答案:

答案 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()