C++11 按位与std::atomic<;布尔>;

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作为变通方法来获得相同的结果,但我担心我可

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

我想用一个按位的

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
的过程中更改
状态的可能性,谢谢,这是一个完美的解决方案。非常感谢。