조건 c
이 있으면 원자 적으로 a = b
을 할당하고 조건이 충족되지 않으면 할당하지 않아야합니다. C/C++에서이 작업을 수행 할 수있는 방법이 있습니까?C/C++에서 조건이 만족되면 값을 원자 적으로 설정하는 방법은 무엇입니까?
설명 : "원자 적으로 할당"하기보다는 기본적으로 "테스트하고 할당하기"를 의미했습니다.
조건 c
이 있으면 원자 적으로 a = b
을 할당하고 조건이 충족되지 않으면 할당하지 않아야합니다. C/C++에서이 작업을 수행 할 수있는 방법이 있습니까?C/C++에서 조건이 만족되면 값을 원자 적으로 설정하는 방법은 무엇입니까?
설명 : "원자 적으로 할당"하기보다는 기본적으로 "테스트하고 할당하기"를 의미했습니다.
일반적으로 필요한 작업을 수행하는 단일 작업은 없습니다. 대문자 인 은 c
테스트에서 a
이 이미 특정 값으로 설정되어있는 경우에 해당되는 경우입니다. 여기
std::atomic<int> value;
...
int expected = 9;
bool result = std::atomic_compare_exchange_strong(&value, &expected, 10);
value
10은 조건 value == 9
이 사실이 보유하고있는 경우에만, 모든 작업이 원자 인으로 설정 :이 경우, 당신이 필요로하는 작업은 예를 들어 비교 및 교환이다.
조건이이 양식을 사용하지 않는 경우, 원 자성을 달성하기 위해 뮤텍스 (또는 다른 여러 연산 메커니즘)를 사용해야합니다.
c
이 자체 속성 인 a
일 경우 비교 원자 단위 작업으로 문제를 해결할 수 있습니다. 당신은 코멘트가 아니라고 지적했다.
c
(상태를 읽거나 상태를 수정하는 모든 항목) 및 a
(일반 std::mutex
의 잠금 내에서 모든 액세스 줄 바꿈).
테스트 c
그리고 a
에 할당하면 std::mutex
입니다.
실패하면 단일 스레드 프로그램을 작성하십시오.
OS 레벨 API를 사용하여 자신의 프로세스를 제외한 모든 스레드를 일시 중지 한 다음 c
을 테스트하고 a
에 할당 할 수 있습니다. 이것은 c
또는 a
이 반이용 상태 (즉, 비 절연 상태) 인 것을 볼 수 있으며, 스레드 일시 중지 계획을 사용하면 실질적으로이를 피할 수있는 경향이없는 경향이 있습니다 (c
및 a
). 자물쇠가없는 원자 그 자체입니다.
이 계획은 매우 위험하고 취약합니다.
문제가 해결되지 않으면 문제를 추상적으로 덜 묘사하고 다른 질문을하십시오. 확률은 문제의 덜 추상적 인 버전으로 합리적인 솔루션을 제공합니다.
C 또는 C++? 그것들은 매우 다른 언어입니다! 특히 atomics에 관해서. –
'c' 조건은'a'의 현재 값에 의존합니까? ('compare-and-swap' 태그가 붙어 있기 때문에 묻습니다.) – Thomas
"원자"를 정의하십시오. 어떤 상황에서? – tadman