.NET에서 세마포어로 카운트하는 방법이 있습니까? 스레드 수를 필요로하지 않으며 합리적인 근사값이므로 GUI 스레드에서 상태를보고하십시오.세마포 카운트
현재 이중 카운터를 사용하고 있습니다. 실제 세마포어와 동기화되어 증가 및 감소하는 다른 변수이지만 이것은 성가 시며 오류가 발생하기 쉽습니다.
.NET에서 세마포어로 카운트하는 방법이 있습니까? 스레드 수를 필요로하지 않으며 합리적인 근사값이므로 GUI 스레드에서 상태를보고하십시오.세마포 카운트
현재 이중 카운터를 사용하고 있습니다. 실제 세마포어와 동기화되어 증가 및 감소하는 다른 변수이지만 이것은 성가 시며 오류가 발생하기 쉽습니다.
아니요. 이렇게하려면 세마포를 카운터로 무언가로 감싸 야합니다. 스레드 안전성에 신경 쓰지 않기 때문에 그리 어렵지 않을 것입니다.
세마포어 대신 Interlocked.Increment와 Interlocked.Decrement를 사용할 수 있습니다. 이렇게하면 일반 변수이기 때문에 쉽게 현재 값을 읽을 수 있습니다.
카운트가 0이되는 상황에 대해 일종의 뮤텍스와 함께 사용하면 작업이 완료되어야합니다. 선택한 뮤텍스 또는 WaitHandle로부터 상속하면 재사용 가능한 멋진 구성 요소를 얻을 수 있습니다.
Interlocked 클래스를 참조하십시오.
방금 내가 이미 말한 것을 설명했습니다. –
그러면 문제가 생깁니 까? 본질적으로 오류가 발생하는 것은 아닙니다.하지만 Interlocked를 사용하지 말고 다른 잠금을 대신 사용해야합니다. 구현에 문제가있는 경우 SO에 게시하십시오. 성가신 ... 글쎄, 때로는 자신의 코드를 작성해야합니다. – Thorarin
여하튼 Process Explorer가이를 수행합니다. 그것은 최대 카운트뿐만 아니라 현재 카운트를 추출하기 때문에 아마도 깊은 윈도우 API 매직을 포함 할 것입니다.
또한
int old_count=0;
if (AcquireSemaphore(timeout=0)) {
ReleaseSemaphore(&old_count);
old_count += 1;
}
의 도덕적 동등를 시도 할 수 있지만이는 세마포어를 사용하는 코드에 가볍게 방해한다는 경고가 있습니다.
한숨, 나는 당신이 그렇게 말할 것 같았습니다. –