Как вы получаете текущий счет от CSemaphore? - PullRequest
3 голосов
/ 19 августа 2011

Я пытаюсь отладить многопоточную программу, которая использует CSemaphore для ограничения размера буфера.

Как вы получаете текущее значение счетчика семафоров из этого класса? Кажется, к нему нет прямого доступа ни от одного из его членов, и я не могу найти никаких функций, которые бы мне его давали.

Ответы [ 2 ]

2 голосов
/ 19 августа 2011

Вас это не должно волновать - это семафор, а не общий счетчик потоков.

Тем не менее, вы можете злоупотребить выходным параметром ReleaseSemaphore API lpPreviousCount

BOOL WINAPI ReleaseSemaphore(
  __in       HANDLE hSemaphore,
  __in       LONG lReleaseCount,
  __out_opt  LPLONG lpPreviousCount
);

Идея:

CSemaphore &mySemaphore = /*initialized from somewhere*/;

HANDLE hsem = (HANDLE) mySemaphore; // http://msdn.microsoft.com/en-us/library/f5zcch25.aspx
LONG peeked_count;
::ReleaseSemaphore(hsem, 1 /*can't be 0, sorry!*/, &peeked_count);

Обратите внимание, что, к сожалению, вам действительно нужно освободить семафор (lReleaseCount должен быть> 0)

0 голосов
/ 19 августа 2011

Это не легко возможно.Если вы действительно хотите это сделать, все, что я могу придумать, это попытаться заблокировать семафор вручную столько раз, сколько это возможно, до тех пор, пока не произойдет сбой блокировки, с 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 */
}
...