원자 부울 플래그로 C++ std::atomic_flag
을 사용하고 있습니다. 플래그를 true 또는 false로 설정하는 것은 문제가 아니지만 일부 값으로 설정하지 않고 플래그의 현재 상태를 쿼리하는 방법은 무엇입니까? 방법이 'atomic_flag_clear
'이고 'atomic_flag_set
'인 것을 알고 있습니다. 그들은 이전 상태를 되돌려 주지만 현재 상태도 수정합니다. 플래그 상태를 수정하지 않고 쿼리 할 수있는 방법이 있습니까? 아니면 완전한 fledged 'std::atomic<bool>
'을 사용해야합니까?C++ atomic_flag 쿼리 상태
답변
std::atomic_flag
의 값을 true
으로 설정하지 않고 읽을 수 없습니다. 이는 의도적으로 설계된 동작입니다. 그것은 부울 변수 (우리는 그것에 대해 std::atomic<bool>
을가집니다)이지만, C++ 11을 지원하는 모든 아키텍처에서 lock free가 보장되는 최소한의 플래그입니다.
일부 플랫폼에서는 원자 적 명령어 만 교환 명령어입니다. 이러한 플랫폼에서 std::atomic_flag::test_and_set()
은 exchange var,1
및 clear()
을 exchange var,0
으로 구현할 수 있지만 값을 읽을 수있는 기본 명령은 없습니다.
값을 변경하지 않고 값을 읽으려면 std::atomic<bool>
이 필요합니다. 당신이 스레드가 종료할지 여부를 결정하기 위해 atomic_flag
를 사용하려면
방금 책을 인용하고 싶었습니다. – haohaolee
디버깅 목적의 값만 인쇄하려면 어떻게해야합니까? 이제는'.__ val' 요소를 사용하지만 gcc의 일부 버전에서는 오류가 발생합니다 (맞습니다.) – user1273684
수정하지 않고 어떤 목적 으로든'std :: atomic_flag '값을 합법적으로 읽을 수 없습니다 그것. 그것을 읽고 싶다면 (printf 디버깅을 위해서조차도), std :: atomic
, 당신은 이런 식으로 작업을 수행 할 수 있습니다
초기화 :
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();
- 1. API를 사용하여 Amazon EC2 상태 상태 쿼리
- 2. 년에 관계 상태 변경 쿼리
- 3. SQL 쿼리 상태 - 소유자 % WF %
- 4. 무 상태 또는 상태 C# 배우
- 5. C# 버튼 텍스트 상태
- 6. C++ 상태 머신 생성기
- 7. C++ 표준의 상태
- 8. 완료 상태 양식 C#
- 9. 시스템 상태 함수 C#
- 10. C# 프린터 상태 확인
- 11. C# 7za.exe 프로세스 상태
- 12. C++ 힙 상태 차이
- 13. C++의 상태 플래그
- 14. C++ 컴파일시의 상태 변수
- 15. Windows 서비스 상태 C++?
- 16. opentk/C# 키보드 상태
- 17. MySQL 하위 쿼리/복잡한 쿼리 질문, 상태 변경 추적
- 18. PHP에서 마지막 SQL 쿼리 상태 저장
- 19. 로그인 상태, 자바 스크립트에 대한 URL을 쿼리
- 20. PyCUDA : 장치 상태 쿼리 (구체적으로 메모리)
- 21. 상태 IN()을 사용하는 복잡한 MySql 쿼리
- 22. 쿼리 내에서 전달 된 사용자의 상태 업데이트
- 23. MySQL의 쿼리 문제를 알 수없는 열 상태
- 24. SQL을 사용한 상태 변경 추적/쿼리
- 25. Erlang 및 C/C++ 통합 상태?
- 26. C++에서 상태 시스템 설계
- 27. 상태 시스템에 입력 전달 (C#)
- 28. 솔라리스 C++의 교착 상태
- 29. C++ : 상태 및 제어 패턴
- 30. 트위터 상태 업데이트 (C 앱
유일한 용도는 자물쇠를 사기위한 수단 인 것으로 보입니다. 'std :: atomic_flag'를 공유 리소스에 접근하기 전에 얻을 수있는 잠금으로 사용할 수 있습니다.하지만 공유 리소스가 단지 'bool'일 뿐이라고 말했을 때, 당신은'std :: atomic'. _Edit : _ 또는 오히려 std :: atomic_bool, 어떻게 그들이 당신을 위해 하나의 전문적인 문제에 갔는지 보았습니다! –
Rook
올바른 획득/릴리스 의미 (즉, 'atomic_flag_set'으로 잠그고 실제 값을 변경 한 경우에만 수행)을 사용하지 않으면 현재 상태를 알 수 없습니다. 읽기만하면 가치를 읽었을 때 그 가치가 무엇인지 알려주고 나중에 변경 될 수 있습니다. –
@Mike : 실제로 중요합니까? 모든 OP가 원하는 것처럼 들리는 것은 원자 적 판독을 수행하고 순서화 된 읽기 및 쓰기의 개념을 갖는 능력입니다. – Rook