Windows Threading-C ++ - PullRequest
       3

Windows Threading-C ++

2 голосов
/ 21 октября 2011

Я ищу API для окон, который позволяет создавать и уничтожать потоки по желанию.Также есть возможность привязывать потоки к ядрам.Я познакомился с Win32 Threading API здесь .
Однако, когда я проверял MSDN, я вижу _beginthreadex () и _endthreadex ().Так что я предполагаю, что каждый раз, когда я создаю тему, нужно обращаться к _endthreadex?
Чтобы получить ответы на такие вопросы, я ищу учебник по Windows Threading.Может кто-нибудь помочь с этим?

PS Это может быть не по теме, но поддерживает ли Boost сродство потоков тоже?Если так, может кто-нибудь указать мне учебник / документацию, связанную с сродством потока?

Ответы [ 3 ]

3 голосов
/ 21 октября 2011

Создав поток (например, с _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;
  }
}

См. Синхронизация потоков для начинающих для примера кода и описания.

0 голосов
/ 21 октября 2011

1) Не путайте _beginthread / _beginthreadex и функцию Win32 API CreateThread . Это два разных API. Подробнее см. Другие сообщения SO .

2) Если вы используете _beginthread / _beginthreadex, _endthread / _endthreadex следует использовать для завершения

3) TerminateThread (а также _endthread) не следует использовать при нормальных условиях. См. MSDN Post .

4) Такие функции, как SetThreadAffinityMask или SetThreadIdealProcessor могут использоваться для установки ядра, которое должен использовать поток.

5) API-интерфейс Boost threading гораздо более надежный и простой. На самом деле это основа потоков C ++ 11.

0 голосов
/ 21 октября 2011

Если вы используете MFC, вы можете лучше использовать CWinThread.Вы можете отправлять сообщения в ветку очень легко и контролировать поведение потока извне.Используя дескриптор потока, вы можете предоставить маску сходства для потока, используя SetThreadAffinityMask , который будет планировать поток на желаемом процессоре (ах).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...