void push(T item)
{
EnterCriticalSection(&m_Sync);
data[m_back] = item;
m_back = (m_back + 1) % (m_capacity);
m_count++;
ReleaseSemaphore(hMessageSem, 1, NULL);
LeaveCriticalSection(&m_Sync);
}
Ждущая очередь. WaitForMultipleObjects?
В программе много потоков и каждый записывает что-то в очередь (запись синхронизирована кр. секциями). примерно так:
Код:
при этом счетчик семафора hMessageSem увеличивается на 1.
и есть ОДИН поток, который выбирает из очереди элементы. примерно так:
Код:
DWORD __stdcall manager(LPVOID v)
{
HANDLE hEvents[] = {m_hExitEvent, hMessageSem};
DWORD dwRet;
BOOL bContinue = TRUE;
while(bContin!!ue)
{
dwRet = WaitForMultipleObjects(2, hEvents, FALSE, INFINITE);
switch(dwRet)
{
case WAIT_OBJECT_0: // exit()
{
bContinue = FALSE;
break;
}
case WAIT_OBJECT_0 + 1: // message()
{
Item item = messageQueue.pop();
cout << item.code << " " << item.text << endl;
break;
}
}
}
return 0;
}
{
HANDLE hEvents[] = {m_hExitEvent, hMessageSem};
DWORD dwRet;
BOOL bContinue = TRUE;
while(bContin!!ue)
{
dwRet = WaitForMultipleObjects(2, hEvents, FALSE, INFINITE);
switch(dwRet)
{
case WAIT_OBJECT_0: // exit()
{
bContinue = FALSE;
break;
}
case WAIT_OBJECT_0 + 1: // message()
{
Item item = messageQueue.pop();
cout << item.code << " " << item.text << endl;
break;
}
}
}
return 0;
}
через какое-то время WaitForMultipleObjects выдает ошибку WAIT_FAILED, GetLastError() = ERROR_INVALID_HANDLE, хотя с hMessageSem вроде все в порядке.
ЧТО ДЕЛАТЬ?
Может стоит организовать ждущую очередь по другому, есть идеи?
буду рад любой помощи. :)
и как реализовать СВОЮ функцию ожидания не прыгая в ядро, и не загружая процессор? :)
По-моему WaitForSingleObject/WaitForMultipleObject как раз и существуют для того чтоб функция не загружала процессор а ожидала.
и с ней странности, в этом и суть темы. :-D
З.Ы. Имхо, в этом одном потоке в самом начале было б неплохо залочить очередь, а в конце разлочить.
да не в очереди дело - WaitForMultipleObjects вылетает с ошибкой.
Рихтера я посмотрел в_первую_очередь.
потом погуглил - ничего не нашел.
на каком-то англоязычном сайте один чел писал что ТОЖЕ столкнулся с похожей проблемой на WaitForMultipleObjects, и ТОЖЕ ничего не нашел.
Другие методы синхронизации вряд ли подойдут.
---
КАК СДЕЛАТЬ НОРМАЛЬНУЮ ЖДУЩУЮ ОЧЕРЕДЬ? (ВОТ ВОПРОС)
если уж c WaitForMultipleObjects разобраться нельзя...
Цитата:
Код:
WaitForMultipleObjects(2, hEvents, FALSE, INFINITE);
А hEvents без & C++ нормально переваривает (я в C не очень)?
Мне что-то кажется, в данной программе работа с ним не соответствует логике использования семафоров. Например: где-то push, вызывается Release. А что Release, если его ещё не занимали?
Поэтому вопрос:с какой целью здесь этот семафор, для чего?
ReleaseSemaphore увеличивает на какое-то количество счетчик(на 1 у меня), WaitForMultipleObjects уменьшает на 1.
-> сколько раз вызвали ReleaseSemaphore(..., 1, ...), столько раз сработает WaitForMultipleObjects в цикле.
ReleaseSemaphore у меня вызывается в методе push, чтобы методом pop через WaitForMultipleObjects можно было получить какие-то данные, предварительно их дождавшись.
-
PS: я отказался от семафора :-D
использую событие(очередь пустая/непустая).
да даже не в этом дело было, так - мелкие ошибки вообще в другой части программы...
в общем сейчас-то все работает. :)