2017-01-20 3 views
2

私は、複数のスレッドによって読み書きされるエラーステータスブール値を持っています。最初はtrueに設定され、操作が失敗した場合はfalseに設定する必要があります。ビット単位のANDとstd :: atomic <bool>

私はビット単位を使用していたなどので:

std::atomic<bool> status; 

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

しかしoperator&=std::atomic<bool>boolの間で許可されていません。

私は同じ結果を得るために回避策としてstd::atomic<int>を使用することができましたが、私はバグを導入する可能性があると心配しています。

オペレータ&を使用する方法がありますか、または使用可能な構文のみがfunc1()/ func2()の戻り値をチェックし、ステータスをfalseにしてください。

+2

'func1'の呼び出し中に' status'が変化する可能性を考慮しない計画です –

答えて

2

C++では、真と偽はそれぞれ暗黙的に1と0に変換されます。したがって、boolでのビット操作操作を使用すると、(少し珍しい場合は)問題ありません。スレッドされていないMMが指摘したように

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

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

    return tmp; 
} 

、あなたのフォールバックのシナリオは、単にfunc()の戻り値を割り当てる: ビット単位操作の割り当てはstd::atomic<bool>でサポートされていますが、のための「ビット単位のANDと割り当てる」あなたは何かを定義することができていません安全。 func()が返された後、もう1つのスレッドでに設定し、もう一度trueに設定することができます。

+0

ありがとうございます、それは完璧な解決策です。とても感謝している。 – Jary316

関連する問題