Semaphore zum zaehlen

16/02/2012 - 15:45 von Curtis Newton | Report spam
Hallo,

ich wundere mich, warum

HANDLE sem_write = CreateSemaphore(NULL, 3, 3, NULL);

WaitForSingleObject(sem_write, 0L);
WaitForSingleObject(sem_write, 0L);
WaitForSingleObject(sem_write, 0L);
WaitForSingleObject(sem_write, 0L);
WaitForSingleObject(sem_write, 0L);
WaitForSingleObject(sem_write, 0L);

durchlàuft, ohne beim vierten Aufruf von WaitForSingleObject zu blocken.
Ich nehme mal an, es gilt das gleiche wie bei Mutexen:

The thread that owns a mutex can specify the same mutex in repeated
wait function calls without blocking

Ich will aber eine "richtige" Semaphore (ich habe ein Erzeuger-
Verbraucher-Problem, welches ich damit lösen will). Also eine, die
runterzàhlt, wenn ich WaitForSingleObject aufrufe, egal von welchen
Thread.

Was tun?

C.
 

Lesen sie die antworten

#1 Jochen Kalmbach [MS MVP]
16/02/2012 - 18:32 | Warnen spam
Ich nehme mal an, es gilt das gleiche wie bei Mutexen:
The thread that owns a mutex can specify the same mutex in repeated
wait function calls without blocking



Wir kommst Du da drauf?
Du solltes mal "INFINITE" anstelle von "0" verwenden oder den
Rückgabewert auswerten ;)

Das ganze làsst sich auch einfach Debuggen mit WinDbg, der zeigt Dir
dann an, dass der Counter immer brav runtergezàhlt wird...

0:000> !handle 38 f
Handle 38
Type Semaphore
Attributes 0
GrantedAccess 0x1f0003:
Delete,ReadControl,WriteDac,WriteOwner,Synch
QueryState,ModifyState
HandleCount 2
PointerCount 3
Name <none>
Object Specific Information
Semaphore Count 0
Semaphore Limit 3


Greetings
Jochen

Ähnliche fragen