2009-07-16 7 views
4

.NET에서 세마포어로 카운트하는 방법이 있습니까? 스레드 수를 필요로하지 않으며 합리적인 근사값이므로 GUI 스레드에서 상태를보고하십시오.세마포 카운트

현재 이중 카운터를 사용하고 있습니다. 실제 세마포어와 동기화되어 증가 및 감소하는 다른 변수이지만 이것은 성가 시며 오류가 발생하기 쉽습니다.

답변

0

아니요. 이렇게하려면 세마포를 카운터로 무언가로 감싸 야합니다. 스레드 안전성에 신경 쓰지 않기 때문에 그리 어렵지 않을 것입니다.

+0

한숨, 나는 당신이 그렇게 말할 것 같았습니다. –

2

세마포어 대신 Interlocked.Increment와 Interlocked.Decrement를 사용할 수 있습니다. 이렇게하면 일반 변수이기 때문에 쉽게 현재 값을 읽을 수 있습니다.

카운트가 0이되는 상황에 대해 일종의 뮤텍스와 함께 사용하면 작업이 완료되어야합니다. 선택한 뮤텍스 또는 WaitHandle로부터 상속하면 재사용 가능한 멋진 구성 요소를 얻을 수 있습니다.

Interlocked 클래스를 참조하십시오.

+0

방금 ​​내가 이미 말한 것을 설명했습니다. –

+0

그러면 문제가 생깁니 까? 본질적으로 오류가 발생하는 것은 아닙니다.하지만 Interlocked를 사용하지 말고 다른 잠금을 대신 사용해야합니다. 구현에 문제가있는 경우 SO에 게시하십시오. 성가신 ... 글쎄, 때로는 자신의 코드를 작성해야합니다. – Thorarin

0

여하튼 Process Explorer가이를 수행합니다. 그것은 최대 카운트뿐만 아니라 현재 카운트를 추출하기 때문에 아마도 깊은 윈도우 API 매직을 포함 할 것입니다.

또한

int old_count=0; 
if (AcquireSemaphore(timeout=0)) { 
    ReleaseSemaphore(&old_count); 
    old_count += 1; 
} 

의 도덕적 동등를 시도 할 수 있지만이는 세마포어를 사용하는 코드에 가볍게 방해한다는 경고가 있습니다.