2012-12-04 2 views
3

"고유 한"유형 정수가 있습니다.이 경우 정수 잠금이 필요합니까?

int unique=0; 
public int GetUniqueId() 
{ 
    return unique++; 
} 

은 내가 조금 과민하고있어 알고 있지만,이 원자 작업입니다, 또는 잠금 어떤 형태의 필요 :이처럼 사용할 수 있습니까? 이 함수는 매우 동시적인 클래스에서 사용됩니다.

답변

9

아니오; 이 부분은 이 아니며, 아님입니다.
x++은 세 개의 개별 명령어 (로드, 증가, 저장)로 컴파일되며 다른 스레드가 인터럽트 할 수 있습니다.

여러 스레드에서 실행되는 경우 Interlocked.Increment(ref unique) (원자 단위)을 호출해야합니다.
이 호출은 정규 증가보다 다소 느리며 전체 잠금보다 훨씬 빠릅니다.

+0

그리고 이것은 동시 코드를 작성하는 것이 매우 무서운 것입니다. – Earlz

+0

메모리가 정렬 되었다면 x86 명령어 집합의 inc는 원자 적이라고 생각 했습니까? –

+0

@ ta.speot.is 사실 일지 모르지만 IL에 원자'inc' 명령어가 없다는 것을 알고 있습니다 ... 그렇기 때문에 특정 JIT 컴파일러에서는 x86에서 원자 일 수는 있지만 보장 할 수는 없습니다. 그래서 .. – Earlz

0

이 방법을 동시 스레드가 사용하는 경우 잠금을 설정하여 동시성을 처리해야합니다.

관련 문제