按位与 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
。
我有一个错误状态布尔值,它是多个线程 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
。