2011-09-13 2 views
1

(부호없는) 정수 카운터를 구현하는 코드를 작성했습니다.원자 단위 증가 및 비교 및 ​​교체 연산으로 정수 오버플로를 처리하는 방법은 무엇입니까?

  1. 임의의 수의 스레드에서 사용됩니다.
  2. 스레드는 오버플로가 발생할 때까지 항상 고유 한 값을 가져야합니다.
  3. 정수 유형 범위가 오버 플로우 된 경우 0을 반환해야합니다.
  4. 내 처분에 원자 증가 함수 (이전 값 반환) 및 원자 비교 및 ​​교체 함수가 있습니다.

모든 시나리오 나는 오버플로에 대한 경쟁 조건으로 인해 어려움을 겪고 있습니다. 이러한 제약 조건으로 카운터를 구현할 수 있습니까?

+0

사용 cas 값이 최대 값에 도달했다면 cas 앞에서 확인할 수 있습니다. "long long"과 64 bit cas을 사용하십시오. – bestsss

답변

5

비교 - 교환에서 모든 것을 만들 수 있습니다. 일반적인 알고리즘

int DoSomeAtomicCalculation() 
{ 
    static int value; 
    int capture, newValue; 
    do { 
     capture = value; 
     newValue = some_function_based_on(capture); 
    } while (!compare_and_swap(value, capture, newValue)); 
    return newValue; 
} 

(나는 compare_and_swap 변수, 비교 값 및 스왑 값을 취한다고 가정하고있어이며) 비교가 성공 (및 교체가 발생한 경우에는 true 반환한다.

+0

물론! 어떤 이유로 "compare and swap"의 "compare"부분을 잊어 버렸습니다. –

+1

그것은 부족합니다 카페인 : 뇌는 모든 실린더에서 멈춘다. –

+0

원자 단위로 인라인 asm을 사용하고 EFLAGS에서 오버플로 플래그를 확인할 수도 있습니다 – damageboy

관련 문제