// it - итератор на элемент списка, содержащего хэндлы событий и потока for(;;)
{
dwRes = WaitForMultipleObjects(2, handles, FALSE, INFINITE);
switch(dwRes - WAIT_OBJECT_0)
{
case 0:
// получаем событие
DbgPrintF(_T("Finish. \n"));
goto FINISH;
// выполняем зачистку
m_csPoolGuard.Lock();
CloseHandle(it->hWorkEvent);
it->hWorkEvent = NULL;
CloseHandle(it->hStopEvent);
it->hStopEvent = NULL;
/*CloseHandle(it->hThread);
it->hThread = NULL;*/
m_listPool.erase(it);
m_csPoolGuard.Unlock();
Если CloseHandle(it->hThread) раскомментрировать, то WaitForMultipleObjects срабатыает тогда, когда один из потоков еще продолжает выполнениею. Если нет, мы не выходим из WaitForMultipleObjects.
Отладочный вывод при закомментированом CloseHandle(it->hThread) следующий:
Thread pool size: 3.
Signal 0.
Finish.
Signal 1.
Finish.
Signal 2.
Finish.
Thread quit!!!
Thread quit!!!
Thread quit!!!
Before wait!!!
Как видно, события пробудили потоки, потоки закончили выполнение, но по прежнему ждем на WaitForMultipleObjects. Из-за чего это может быть?
Re: WaitForMultipleObjects не возвращает управление
От:
Аноним
Дата:
20.05.08 07:40
Оценка:
DllMain?
Re[2]: WaitForMultipleObjects не возвращает управление
От:
Аноним
Дата:
20.05.08 07:43
Оценка:
Здравствуйте, Аноним, Вы писали:
А>DllMain?
Можно поподробнее насчет DllMain
Re: WaitForMultipleObjects не возвращает управление
После посылки сигнала потоку, я ожидаю его завершения вот таким образом.
while(1)//цикл ожидания завершения работы
{
DWORD lpExitCode;
BOOL Result=GetExitCodeThread(
WorkThreadHandle, // handle to the thread
&lpExitCode // termination status
);
if(!Result)
break;
if(lpExitCode!=STILL_ACTIVE)
break;
Sleep(150);
}
Здравствуйте, Аноним, Вы писали:
А>Создаю несколько потоков и в деструкторе класса ожидаю их завершения.
А>Данный фрагмент отрабатывает в деструкторе. Для каждого потока сигналим событие и ожидаем завершения. А>
А>Если CloseHandle(it->hThread) раскомментрировать, то WaitForMultipleObjects срабатыает тогда, когда один из потоков еще продолжает выполнениею. Если нет, мы не выходим из WaitForMultipleObjects. А>Отладочный вывод при закомментированом CloseHandle(it->hThread) следующий:
А>Thread pool size: 3. А>Signal 0. А>Finish. А>Signal 1. А>Finish. А>Signal 2. А>Finish. А>Thread quit!!! А>Thread quit!!! А>Thread quit!!! А>Before wait!!!
А>Как видно, события пробудили потоки, потоки закончили выполнение, но по прежнему ждем на WaitForMultipleObjects. Из-за чего это может быть?
Re[3]: WaitForMultipleObjects не возвращает управление
От:
Аноним
Дата:
20.05.08 07:52
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Аноним, Вы писали:
А>>DllMain?
А>Можно поподробнее насчет DllMain
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Аноним, Вы писали:
А>>DllMain?
А>Можно поподробнее насчет DllMain
в поиск! Ожидание в DllMain.
kalsarikännit
Re[3]: WaitForMultipleObjects не возвращает управление
От:
Аноним
Дата:
20.05.08 08:20
Оценка:
А>Можно поподробнее насчет DllMain
В DllMain нельзя ждать начала и завершения выполнения потоков. Кстати конструкторы и деструкторы статических объектов в dll неявно выполняются в DllMain.
Re[4]: WaitForMultipleObjects не возвращает управление
От:
Аноним
Дата:
20.05.08 08:27
Оценка:
Здравствуйте, Аноним, Вы писали:
А>>Можно поподробнее насчет DllMain А>В DllMain нельзя ждать начала и завершения выполнения потоков. Кстати конструкторы и деструкторы статических объектов в dll неявно выполняются в DllMain.
А что произойдет, если в DllMain будет ожидание завершения потока. Что приводит к dead lock?
Re[5]: WaitForMultipleObjects не возвращает управление
От:
Аноним
Дата:
20.05.08 10:10
Оценка:
А>А что произойдет, если в DllMain будет ожидание завершения потока. Что приводит к dead lock?
PEB lock