2012-06-19 2 views
26

원자 부울 플래그로 C++ std::atomic_flag을 사용하고 있습니다. 플래그를 true 또는 false로 설정하는 것은 문제가 아니지만 일부 값으로 설정하지 않고 플래그의 현재 상태를 쿼리하는 방법은 무엇입니까? 방법이 'atomic_flag_clear'이고 'atomic_flag_set'인 것을 알고 있습니다. 그들은 이전 상태를 되돌려 주지만 현재 상태도 수정합니다. 플래그 상태를 수정하지 않고 쿼리 할 수있는 방법이 있습니까? 아니면 완전한 fledged 'std::atomic<bool>'을 사용해야합니까?C++ atomic_flag 쿼리 상태

+1

유일한 용도는 자물쇠를 사기위한 수단 인 것으로 보입니다. 'std :: atomic_flag'를 공유 리소스에 접근하기 전에 얻을 수있는 잠금으로 사용할 수 있습니다.하지만 공유 리소스가 단지 'bool'일 뿐이라고 말했을 때, 당신은'std :: atomic '. _Edit : _ 또는 오히려 std :: atomic_bool, 어떻게 그들이 당신을 위해 하나의 전문적인 문제에 갔는지 보았습니다! – Rook

+5

올바른 획득/릴리스 의미 (즉, 'atomic_flag_set'으로 잠그고 실제 값을 변경 한 경우에만 수행)을 사용하지 않으면 현재 상태를 알 수 없습니다. 읽기만하면 가치를 읽었을 때 그 가치가 무엇인지 알려주고 나중에 변경 될 수 있습니다. –

+0

@Mike : 실제로 중요합니까? 모든 OP가 원하는 것처럼 들리는 것은 원자 적 판독을 수행하고 순서화 된 읽기 및 쓰기의 개념을 갖는 능력입니다. – Rook

답변

39

std::atomic_flag의 값을 true으로 설정하지 않고 읽을 수 없습니다. 이는 의도적으로 설계된 동작입니다. 그것은 부울 변수 (우리는 그것에 대해 std::atomic<bool>을가집니다)이지만, C++ 11을 지원하는 모든 아키텍처에서 lock free가 보장되는 최소한의 플래그입니다.

일부 플랫폼에서는 원자 적 명령어 만 교환 명령어입니다. 이러한 플랫폼에서 std::atomic_flag::test_and_set()exchange var,1clear()exchange var,0으로 구현할 수 있지만 값을 읽을 수있는 기본 명령은 없습니다.

값을 변경하지 않고 값을 읽으려면 std::atomic<bool>이 필요합니다. 당신이 스레드가 종료할지 여부를 결정하기 위해 atomic_flag를 사용하려면

+0

방금 ​​책을 인용하고 싶었습니다. – haohaolee

+0

디버깅 목적의 값만 인쇄하려면 어떻게해야합니까? 이제는'.__ val' 요소를 사용하지만 gcc의 일부 버전에서는 오류가 발생합니다 (맞습니다.) – user1273684

+0

수정하지 않고 어떤 목적 으로든'std :: atomic_flag '값을 합법적으로 읽을 수 없습니다 그것. 그것을 읽고 싶다면 (printf 디버깅을 위해서조차도), std :: atomic ' –

12

, 당신은 이런 식으로 작업을 수행 할 수 있습니다

초기화 :

std::atomic_flag keep_running = ATOMIC_FLAG_INIT; 
keep_running.test_and_set(); 

스레드 루프 :

while (keep_running.test_and_set()) { 
    // do thread stuff 
} 

때를 스레드를 종료하고 싶습니다.

keep_running.clear();