按位与 std::atomic<bool>

bitwise AND with std::atomic<bool>

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

我想像这样使用按位 AND:

std::atomic<bool> status;

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

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

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

有没有办法让 operator& 工作,或者唯一可行的语法检查 func1()/func2() 的 return 值并将状态覆盖为 false?

在 C++ 中,true 和 false 分别隐式转换为 1 和 0。因此,在 bool 上使用位操作操作是可以的(如果稍微不寻常的话)。 std::atomic<bool> 不支持按位操作赋值,但对于 'bitwise AND and assign',您可以定义如下内容:

bool operator&=(atomic<bool> &ab, bool val)
{
    bool tmp = ab.load();

    if (val == false)
        ab.store(false);

    return tmp;
}

正如 M.M 所指出的,简单地分配 func() 的 return 值的后备方案不是线程安全的。 另一个线程可以将其设置为 false,而您在 func() return 之后再次将其设置为 true