Завершить длительный поток в пуле потоков, который был создан с помощью QueueUserWorkItem (win 32 / nt5) - PullRequest
0 голосов
/ 03 мая 2010

Я программирую в среде 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 ]

5 голосов
/ 03 мая 2010

ThreadPool не является кандидатом для длительных операций или в случаях, когда требуется явный контроль над потоком.

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

0 голосов
/ 03 мая 2010

Не используйте Thread-Poll. Вместо этого используйте фоновый поток и еще один поток для монитора. Просто создайте поток и позвольте операционной системе беспокоиться о многоядерных процессорах или о типе процессора.

...