Создав поток (например, с _beginthreadex
), вы должны позволить изящному завершению потока, поскольку вы никогда не знаете, находится ли он в середине чего-то сейчас (например, с блокировкой определенного ресурса).Тем не менее, у вас есть возможность в любой момент отказаться от него с помощью TerminateThread
API.
SetThreadAffinityMask
, и друзья позволят вам найти ваши потоки на поле битвы ЦП.Вы можете в конечном итоге оставить планировщик ОС, чтобы выбрать ядра, на которых будут работать ваши потоки, поскольку высока вероятность того, что он будет более эффективным.
Обновление при повторном использовании потоков: при создании потока вы пропускаете процесс потоканачать, и как только вы вернетесь из него, поток будет завершен.То есть запуск другого действия рабочего потока возможен двумя способами: либо создать новый поток с самого начала, либо не выходить из процесса потока и выполнить синхронизацию, чтобы перехватить новый запрос рабочего действия.Последнее может быть реализовано с использованием IPC
объектов, например, событий:
int ThreadProc()
{
while(true)
{
wait for new event;
if(termination requested) break;
otherwise, on worker activity request, do next requested task;
}
}
См. Синхронизация потоков для начинающих для примера кода и описания.