Завершить долго работающий поток в пуле потоков, который был создан с помощью 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. Вместо этого используйте фоновый поток и еще один поток для монитора. Просто создайте поток и позвольте операционной системе беспокоиться о многоядерных процессорах или о любом типе процессора.

Другие вопросы по тегам