Это не легко возможно.Если вы действительно хотите это сделать, все, что я могу придумать, это попытаться заблокировать семафор вручную столько раз, сколько это возможно, до тех пор, пока не произойдет сбой блокировки, с 0 тайм-аутом и разблокировкой сразу после этого.Вам также придется запомнить максимальное количество.Например, непроверенный код:
int max_count = 5;
CSemaphore sem (max_count, max_count);
/*...*/
int count = 0;
while (sem.Lock (0))
++count;
for (int i = 0; i != count; ++i)
sem.Unlock(count);
std::cout << "the lock count is " << (max_count - count);
РЕДАКТИРОВАТЬ:
После просмотра решения sehe я думаю, что лучшим решением будет сочетание обоих:
int max_count = 5;
CSemaphore sem (max_count, max_count);
if (sem.Lock(0))
{
LONG peeked_count;
::ReleaseSemaphore(hsem, 1 /*can't be 0, sorry!*/, &peeked_count);
/* peeked_count has the count */
}
else
{
/* I do not think it is safe to release the semaphore even if just for debugging. */
/* max_count has the count */
}