다음 ID를 알아야하는 많은 스레드를 어떻게 처리하고 그 숫자를 안전하게 점제해야합니까?

StackOverflow https://stackoverflow.com/questions/1402984

  •  05-07-2019
  •  | 
  •  

문제

나는 많은 스레드를 처리하는 프로그램을 사용하는 프로그램을 작업하고 있습니다.

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

이것이 내가 뮤텍스를 사용하는 인스턴스입니까? 대기열을 대신 사용하고 대신 300,000 ID로 채워야합니까? 아니면 불필요합니까?

단일 정수를 가지고 있고 어떻게 든 그 숫자의 검색 및 업데이트를 잠그면 Thread1이 들어오고 다음 ID로 "20"을 얻은 다음 다른 스레드가 기다리는 동안 "21"으로 증가해야합니까?

이 사용 사례의 최고 실습은 무엇입니까?

도움이 되었습니까?

해결책

잠금 상태 에서이 작업을 수행 할 수 있습니다 인터 로크.

이렇게하면 다음과 같이하십시오.

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

이것은 항상 자물쇠없이, 그리고 완벽한 스레드 안전성이없는 증분 정수를 반환합니다.

다른 팁

이것은 아마도 완벽한 후보 일 것입니다 인터 로크.

int id = 0;

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

그만큼 Increment 원자 연산으로 수행되며 스레드 안전입니다.

아니요.

이를 수행하는 가장 좋은 방법은 interlocked.increment ()입니다.

기본적으로 CPU 아키텍처에서 제공 한 보증을 기반으로 잠금없이 스레드 사프 방식으로 증분을 수행 할 수 있습니다.

당신은 조사해야합니다 연동 클래스. 정수의 값을 원자 적으로 증분하는 기능을 제공합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top