C++11 按位与std::atomic<;布尔>;
我有一个由多个线程读/写的错误状态布尔值。它最初设置为true,如果任何操作失败,则应设置为false 我想用一个按位的C++11 按位与std::atomic<;布尔>;,c++11,boolean,atomic,C++11,Boolean,Atomic,我有一个由多个线程读/写的错误状态布尔值。它最初设置为true,如果任何操作失败,则应设置为false 我想用一个按位的 std::atomic<bool> status; status &= func1(); status &= func2(); std::原子状态; 状态&=func1(); 状态&=func2(); 但是在std::atomic和bool之间不允许使用运算符&= 我已经能够使用std::atomic作为变通方法来获得相同的结果,但我担心我可
std::atomic<bool> status;
status &= func1();
status &= func2();
std::原子状态;
状态&=func1();
状态&=func2();
但是在std::atomic
和bool
之间不允许使用运算符&=
我已经能够使用std::atomic
作为变通方法来获得相同的结果,但我担心我可能引入了一个bug
是否有一种方法获得操作符和工作,或者唯一的可行的语法来检查函数的返回值(函数)/函数2~(),并将状态改写为false,C++中的< /P> < P>,真和假分别隐式转换为1和0。因此,在
bool
上使用位操作是可以的(如果稍微不正常)。
std::atomic
不支持按位操作分配,但对于“按位AND和分配”,您可以定义如下内容:
bool operator&=(atomic<bool> &ab, bool val)
{
bool tmp = ab.load();
if (val == false)
ab.store(false);
return tmp;
}
bool运算符&=(原子&ab,bool-val)
{
bool tmp=ab.load();
如果(val==false)
ab.store(假);
返回tmp;
}
正如M.M所指出的,简单地分配func()
的返回值的回退方案不是线程安全的。
另一个线程可以将其设置为
false
,而在func()
返回后再次将其设置为true
。您的计划没有考虑到在调用func1
的过程中更改状态的可能性,谢谢,这是一个完美的解决方案。非常感谢。