Завершить долго работающий поток в пуле потоков, который был создан с помощью QueueUserWorkItem(win 32/nt5)
Я программирую в среде Win32 NT5.
У меня есть функция, которая будет вызываться много раз. Каждый звонок атомарный. Я хотел бы использовать QueueUserWorkItem
воспользоваться преимуществами многоядерных процессоров.
У меня проблема в том, что я хочу дать функции 3 секунды для завершения. Если это не завершено в течение 3 секунд, я хочу прекратить поток.
В настоящее время я делаю что-то вроде этого:
HANDLE newThreadFuncCall= CreateThread(NULL,0,funcCall,&func_params,0,NULL);
DWORD result = WaitForSingleObject(newThreadFuncCall, 3000);
if(result == WAIT_TIMEOUT)
{
TerminateThread(newThreadFuncCall,WAIT_TIMEOUT);
}
Я просто порождаю одну ветку и жду 3 секунды или пока она не завершится. Есть ли в любом случае сделать что-то похожее, но с использованием QueueUserWorkItem
поставить работу в очередь?
2 ответа
ThreadPool не является кандидатом для длительных операций или в случаях, когда вы хотите явно контролировать поток.
Кроме того, вы должны рассмотреть возможность рефакторинга вашей функции, чтобы разрешить постепенный выход с использованием флага прерывания, а не принудительного завершения потока.
Не используйте Thread-Poll. Вместо этого используйте фоновый поток и еще один поток для монитора. Просто создайте поток и позвольте операционной системе беспокоиться о многоядерных процессорах или о любом типе процессора.