2009-09-10 4 views
0

나는 데이터를 처리하는 스레드를 가지고있는 프로그램을 만들고있다.처리 할 다음 ID를 알아야하며 그 번호를 안전하게 증가시키는 많은 스레드를 어떻게 가질 수 있습니까?

각 스레드는 다음 사용 가능한 ID를 가져와 다음 스레드의 ID를 1 씩 증가시켜 스레드로부터 안전한 방식으로 수행해야합니다.

뮤텍스를 사용할 인스턴스입니까? 대신 Queue.Synchronized를 사용해야하며 300,000 개의 ID를 모두 채우거나 불필요한가요?

방금 ​​단일 정수가 있어야하고 어떻게 든 해당 번호의 검색 및 업데이트를 잠그면 thread1이오고 다른 ID가 "20"이되고 다른 스레드가 대기하는 동안 "21"이됩니다.

이 유스 케이스의 모범 사례는 무엇입니까?

답변

4

Interlocked.Increment을 통해 잠금없이이를 수행 할 수 있습니다.

그냥과 같이이 작업을 수행 :

private static int value; 
public static int Value 
{ 
    get { return Interlocked.Increment(ref value); } 
} 

이 항상 잠금없이, 증가하는 정수를 반환하고 완벽한 threadsafety으로합니다.

1

아니요.

가장 좋은 방법은 Interlocked.Increment()입니다.

기본적으로 CPU 아키텍처가 제공하는 보장을 기반으로 잠금없이 스레드 안전 모드로 증분을 수행 할 수 있습니다.

2

이것은 아마도 Interlocked.Increment의 완벽한 후보자입니다.

int id = 0; 

int nextId = Interlocked.Increment(ref id); // returns the incremented value 

Increment은 원자 단위 연산으로 수행되며 스레드로부터 안전합니다.

1

Interlocked class을 조사해야합니다. 정수 값을 원자 적으로 증가시키는 기능을 제공합니다.

관련 문제