2016-11-09 11 views
2

조건 c이 있으면 원자 적으로 a = b을 할당하고 조건이 충족되지 않으면 할당하지 않아야합니다. C/C++에서이 작업을 수행 할 수있는 방법이 있습니까?C/C++에서 조건이 만족되면 값을 원자 적으로 설정하는 방법은 무엇입니까?

설명 : "원자 적으로 할당"하기보다는 기본적으로 "테스트하고 할당하기"를 의미했습니다.

+5

C 또는 C++? 그것들은 매우 다른 언어입니다! 특히 atomics에 관해서. –

+0

'c' 조건은'a'의 현재 값에 의존합니까? ('compare-and-swap' 태그가 붙어 있기 때문에 묻습니다.) – Thomas

+0

"원자"를 정의하십시오. 어떤 상황에서? – tadman

답변

7

일반적으로 필요한 작업을 수행하는 단일 작업은 없습니다. 대문자 인 c 테스트에서 a이 이미 특정 값으로 설정되어있는 경우에 해당되는 경우입니다. 여기

std::atomic<int> value; 
... 
int expected = 9; 
bool result = std::atomic_compare_exchange_strong(&value, &expected, 10); 

value 10은 조건 value == 9이 사실이 보유하고있는 경우에만, 모든 작업이 원자 인으로 설정 :이 경우, 당신이 필요로하는 작업은 예를 들어 비교 및 ​​교환이다.

조건이이 양식을 사용하지 않는 경우, 원 자성을 달성하기 위해 뮤텍스 (또는 다른 여러 연산 메커니즘)를 사용해야합니다.

1

c이 자체 속성 인 a 일 경우 비교 원자 단위 작업으로 문제를 해결할 수 있습니다. 당신은 코멘트가 아니라고 지적했다.

c (상태를 읽거나 상태를 수정하는 모든 항목) 및 a (일반 std::mutex의 잠금 내에서 모든 액세스 줄 바꿈).

테스트 c 그리고 a에 할당하면 std::mutex입니다.

실패하면 단일 스레드 프로그램을 작성하십시오.

OS 레벨 API를 사용하여 자신의 프로세스를 제외한 모든 스레드를 일시 중지 한 다음 c을 테스트하고 a에 할당 할 수 있습니다. 이것은 c 또는 a이 반이용 상태 (즉, 비 절연 상태) 인 것을 볼 수 있으며, 스레드 일시 중지 계획을 사용하면 실질적으로이를 피할 수있는 경향이없는 경향이 있습니다 (ca). 자물쇠가없는 원자 그 자체입니다.

이 계획은 매우 위험하고 취약합니다.

문제가 해결되지 않으면 문제를 추상적으로 덜 묘사하고 다른 질문을하십시오. 확률은 문제의 덜 추상적 인 버전으로 합리적인 솔루션을 제공합니다.