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.
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