2010-05-02 7 views

Respuesta

4

Si desea ese valor para la monitorización externa (como sugiere en su comentario), entonces utilizar el valor anterior después de una llamada al ReleaseSemaphore() o en mi humilde opinión una mejor solución es que implemente su propio contador 'enclavado' además de su semáforo; entonces tiene su conteo de monitoreo y puede acceder a él de la manera que quiera ... Simplemente no lo use como una forma de ver si puede 'ingresar' al semáforo ...

Como Chris dice con razón, usted no puede obtener el recuento actual ya que potencialmente siempre está cambiando.

+0

si reemplaza una solución enclavada por un contenedor con un bloqueo real antes de acceder al semáforo, puede usar el contador como lo desee. – chacham15

2

No existe el "recuento actual" de un semáforo Win32, por lo que no puede obtenerlo.

Quiero decir, evidentemente, en algún momento el conteo de un semáforo tendrá algún valor, pero desde el punto de vista de un hilo, a menos que tome medidas para aumentar o disminuir el conteo de semáforos, otro hilo podría hacer cualquier respuesta recuperada completamente inválida en el momento en que se compute.

Es por esta razón que las funciones de sincronización de Windows API no le permiten realizar el conteo de bloqueos anterior sin un efecto secundario. El efecto secundario garantiza que tiene una ventana de oportunidad válida para usar realmente el valor de una manera significativa.


La obvia "trabajo en torno a" sería hacer algo como

LONG count = 0; 
if(WAIT_OBJECT_0 == WaitForSingleObject(hSemaphore,0L)) 
{ 
    // Semaphores count is at least one. 
    ReleaseSemaphore(hSemaphore,1,&count); 
} 

Por qué es mejor? No estoy seguro. Pero tal vez hay una posibilidad de hacer algo significativo entre esperar y liberar que hubiera sido una condición de carrera si ReleaseSemaphore pudiera liberar 0.

+3

Tal capacidad es útil para la monitorización externa (un ejemplo sería un productor y un consumidor, donde el recuento del semáforo representa el número de objetos pendientes). Por lo tanto, estoy sorprendido de que sea imposible de hacer. –

+0

El problema con la solución alternativa es que probablemente sesgue su uso real del semáforo; potencialmente introducirá esperas en los hilos que están usando el semáforo para el propósito previsto. Las esperas introducidas serán pequeñas pero probablemente suficientes para provocar el cambio de contexto. Es mejor simplemente mantener su propio contador de monitoreo. –

2

La herramienta sysinternals Process Explorer puede mostrar las partes internas de los identificadores win32, incluidos los semáforos y sus recuentos actuales/máximos. Lo suficientemente bueno para la depuración pero no tan útil para el monitoreo automatizado.

Si Process Explorer puede hacerlo, probablemente también pueda ... pero probablemente requiera un profundo conocimiento de las ventanas internas.

4

Esto podría ser un poco tarde pero creo que NtQuerySemaphore() es probablemente lo que desea ver.

+0

https://stackoverflow.com/questions/2579536/semaphores-values –

Cuestiones relacionadas