CreateThread()
- прямой системный вызов. Он реализован на Kernel32.dll
, с которым, скорее всего, ваше приложение уже будет связано по другим причинам. Он всегда доступен в современных системах Windows.
_beginthread()
и _beginthreadex()
- функции-оболочки в среде выполнения Microsoft C (msvcrt.dll
). Различия между двумя вызовами указаны в документации. Таким образом, он доступен, когда доступна среда выполнения Microsoft C или если ваше приложение статически связано с ней. Скорее всего, вы тоже будете ссылаться на эту библиотеку, если только вы не пишете в чистом API Windows (как я часто это делаю).
Ваш вопрос является последовательным и фактически повторяющимся. Как и многие API, в Windows API есть двойная и неоднозначная функциональность, с которой нам приходится иметь дело. Хуже всего то, что документация не проясняет проблему. Я полагаю, что семейство функций _beginthread()
было создано для лучшей интеграции с другими стандартными функциями C, такими как манипуляции с errno
. _beginthread()
, таким образом, лучше интегрируется со средой выполнения C.
Несмотря на это, если у вас нет веских причин для использования _beginthread()
или _beginthreadex()
, вам следует использовать CreateThread()
, главным образом потому, что вы можете получить на одну библиотечную зависимость меньше в вашем конечном исполняемом файле (а для MS CRT это действительно имеет значение немного). У вас также нет кода переноса вызова, хотя этот эффект незначителен. Другими словами, я считаю, что основная причина придерживаться CreateThread()
заключается в том, что нет веских оснований для использования _beginthreadex()
для начала. Функциональные возможности точно или почти одинаковы.
Одной из веских причин для использования _beginthread()
было бы (как кажется, ложное), что объекты C ++ были бы должным образом развернуты / уничтожены, если был вызван _endthread()
.