2011-04-12 4 views
2

gcc를 사용하여 원자 변수에 관한 가짜 질문이 있습니다. 내 컴퓨터가 __sync_add_and_fetch 기능을 지원합니다. 스레드 A에서이 호출을 사용하여 my_variable (int)을 설정합니다.C와 gcc의 원자 변수에 대한 동등성 테스트

공유 변수를 읽는 공유 변수를 값과 비교하여 테스트하려고합니다. 20 는 공유 변수에 경쟁이있을 때 __sync_val_compare_and_swap이 실패 할 수 있습니다 GCC 잘못 아니에요 경우 올바른 다음

if(__sync_bool_compare_and_swap(&my_variable, 20, 20)){ 
      //..Ok! It is 20 so go ahead! 
    }else{ 
      // wrong: it is not ok. 
    } 

를 작성,하지만 난 그것을 반환하지 모르겠어요입니다 __sync_bool_compare_and_swap과 어떻게 작동합니까?

동시에 스레드 A가 __sync_fetch_and_add을 사용하여 값을 변경하는 경우에도 문제가 발생합니까? __sync_bool_compare_and_swap이 동시에 실행 중일 때 sum 이벤트의 값을 반환한다는 것이 항상 보장됩니까?

이상적으로 말하자면, 필자는 실제로 원자 적 읽기 (READ) 만 수행하거나 스왑 (Swap)하는 기능이 정말로 필요할 것입니다. C 나 gcc 같은 것이 있습니까?

덕분에 많은

AFG

+0

이 코드가 유용하다고 생각하면 코드에 주요 논리 문제가 있다고 의심됩니다. –

답변

0

면책 조항 : 나는 GCC _sync 작업을 사용하지 않은하지만 난 그들이 MSVC의 것과 동일 상상에 맡기겠습니다. 나는 그것이 효과가 있다고 믿는다. 원자 적 지시는 경쟁 조건을 막기 위해 항상 하나의 단위로 실행됩니다. 이제, 이것은 당신이 걱정하고있는 변수가 실제 하드웨어에 매핑되어 있지 않다고 가정합니다.

2

원자 적 동작에 관한 한, 중단없이 완료 할 수 있습니다. 동시에 실행할 것으로 예상되는 원자 조작이 여러 개인 경우, 순서와 관련된 경합 조건이 있지만 각 항목은 완료 될 때까지 실행됩니다. 예를 들어, __sync_fetch_and_add이 첫 번째 였다고 가정하면 __sync_bool_compare_and_swap이 비교 및 ​​스왑을 수행하기 전에 가져 오기와 추가를 수행합니다.

다른 시그널링 방법을 고려해보십시오. 한 스레드에서 업데이트되는 값과 다른 스레드에서 정확한 값을 확인하는 경쟁 상태 사이에 경쟁 조건이있을 수 있습니다. 즉, 다른 스레드가 결코 알지 못하는 상태에서 20을 올바르게 업데이트 할 수 있습니다.

그러나이 중 어느 것도 중요하지 않은 경우 하나의 스레드 만 쓰고 다른 읽기 때문에 __sync* 함수없이이 모든 작업을 수행 할 수 있습니다. 손상된 데이터에 대해 걱정할 필요가 없습니다. 또한 당신이 그것과 관련된 별도의 경쟁 조건을 가지고 있기 때문에 변수에 대해 걱정할 필요가 없습니다 (값은 체크 된 것보다 빠르게 업데이트됩니다).