Вопрос о функции Windows API и C / C ++ библиотеки времени выполнения - PullRequest
1 голос
/ 16 ноября 2010

Когда я пишу код C / C ++ для платформы Windows, я обычно использую Windows API по мере необходимости. Но когда дело доходит до многопоточности, я прочитал следующую цитату из <<strong> Windows через C / C ++ >

Функция CreateThread является Функция Windows, которая создает поток. Однако, если вы пишете C / C ++ код, вы никогда не должны звонить CreateThread. Вместо этого вы должны использовать библиотека времени выполнения Microsoft C ++ Функция _beginthreadex. Если вы этого не сделаете использовать компилятор Microsoft C ++, ваш у поставщика компилятора будет свой альтернатива CrateThread. Без разницы эта альтернатива, вы должны использовать его.

AFAIK, библиотека времени выполнения для определенной платформы реализована с помощью API этой платформы. Я думаю, что вполне возможно вызвать CreateThread () из моего кода C / C ++. И я это сделал. Но я просто не понимаю, почему следует соблюдать указанное выше правило.

Большое спасибо за ваши идеи.

Ответы [ 2 ]

4 голосов
/ 16 ноября 2010

Конечно, возможно напрямую использовать Windows API CreateThread.

Но это оставляет библиотеку времени выполнения не информированной о новом потоке.

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

Приветствия & hth.,

3 голосов
/ 16 ноября 2010

C-runtime имеет множество переменных с состоянием, которые хранят такие вещи, как текущая локаль.Эти значения должны быть установлены для каждого потока, в противном случае код в отдельном потоке (например, вызов setlocale) может чрезмерно повлиять на код, выполняющийся в другом потоке.

_beginthread оборачивает ваш поток в код, который выполняет необходимое распределение и освобождение этихструктуры данных потоков.

Если вы вызываете CreateThread напрямую, структуры, вероятно, будут выделяться по мере необходимости, но без оболочки, среда выполнения никогда не будет знать, когда завершится поток, и они будут утечки.

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