2017-01-20 7 views
2

여러 스레드에서 읽고 쓰는 오류 상태 boolean이 있습니다. 처음에는 true로 설정되고, 조작이 실패하면 false로 설정되어야합니다.bitwise AND with std :: atomic <bool>

std::atomic<bool> status; 

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

하지만 operator&=std::atomic<bool>bool 사이에 허용되지 않습니다 :

나는 비트 단위 AND과 같이를 사용하고 싶었다.

동일한 결과를 얻으려는 시도로 std::atomic<int>을 사용할 수 있었지만 버그를 도입 할 수 있다고 걱정됩니다.

& 연산자를 사용하거나 사용할 수있는 유일한 구문을 func1()/func2()의 반환 값을 확인하고 상태를 false로 덮어 씌울 수 있습니까?

+2

'func1'을 호출하는 동안 '상태'가 변경 될 가능성에 대한 계획을 세우지 못합니다. –

답변

2

C++에서 true와 false는 암시 적으로 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()이 반환 된 후에 다른 스레드가 false으로 설정하는 동안 다시 true으로 설정할 수 있습니다.

+0

감사합니다. 완벽한 솔루션입니다. 매우 감사드립니다. – Jary316