﻿# V513\. Use \_beginthreadex/\_endthreadex functions instead of CreateThread/ExitThread functions\.

В программе обнаружено использование функции CreateThread или ExitThread\. Если в параллельных потоках используются функции CRT \(C run\-time library\), то вместо CreateThread/ ExitThread следует вызывать функции \_beginthreadex/\_endthreadex\.

Приведем выдержки из 6\-ой главы книги  Джеффри Рихтера "Windows для профессионалов: создание эффективных Win32\-приложений с учетом специфики 64\-разрядной версии Windows" / Пер\. с англ\. \- 4\-е изд\.

"CreateThread \- это Windows\-функция, создающая поток\. Но никогда не вызывайте ее, если Вы пишете код на С/С\+\+\. Вместо нее Вы должны использовать функцию \_beginthreadex из библиотеки Visual С\+\+\. 

Чтобы многопоточные программы, использующие библиотеку С/С\+\+ \(CRT\),  работали корректно, требуется создать специальную структуру данных и связать ее с каждым потоком, из которого вызываются библиотечные функции\. Более того, они должны знать, что, когда Вы к ним обращаетесь, нужно просматривать этот блок данных в вызывающем потоке чтобы не повредить данные в каком\-нибудь другом потоке\.

Так откуда же система знает, что при создании нового потока надо создать и этот блок данных? Ответ очень прост \- не знает и знать не хочет Вся ответственность \- исключительно на Вас\. Если Вы пользуетесь небезопасными в многопоточной среде функциями, то должны создавать потоки библиотечной функцией \_beginthreadex, а не Windows\-функцией CreateThread \.

Заметьте, что функция \_beginthreadex существует только в многопоточных версиях библиотеки С/С\+\+\. Связав проект с однопоточной библиотекой, Вы получите от компоновщика сообщение об ошибке "unresolved external symbol"\. Конечно, это сделано специально, потому что однопоточная библиотека не может корректно работать в многопоточном приложении\. Также обратите внимание на то, что при создании нового проекта Visual Studio по умолчанию выбирает однопоточную библиотеку\. Этот вариант не самый безопасный, и для многопоточных приложений Вы должны сами выбрать одну из многопоточных версий библиотеки С/С\+\+\." 

Соответственно, для уничтожения потока, созданного с помощью функции \_beginthreadex, необходимо использовать функцию \_endthreadex\.

Дополнительные материалы по данной теме:

1. Обсуждение на сайте Stack Overflow\. "Windows threading: \_beginthread vs \_beginthreadex vs CreateThread C\+\+"\. [http://stackoverflow\.com/questions/331536/windows\-threading\-beginthread\-vs\-beginthreadex\-vs\-createthread\-c](https://stackoverflow.com/questions/331536/windows-threading-beginthread-vs-beginthreadex-vs-createthread-c)
1. Форум на сайте CodeGuru\. "\_beginthread vs CreateThread"\. [http://forums\.codeguru\.com/showthread\.php?371305\.html](https://forums.codeguru.com/showthread.php?371305.html)
1. Обсуждение на форуме MSDN\. "CreateThread vs \_beginthreadex"\. [https://social\.msdn\.microsoft\.com/Forums/vstudio/en\-US/c727ae29\-5a7a\-42b6\-ad0b\-f6b21c1180b2/createthread\-vs\-beginthreadex?forum\=vclanguage](https://social.msdn.microsoft.com/Forums/vstudio/en-US/c727ae29-5a7a-42b6-ad0b-f6b21c1180b2/createthread-vs-beginthreadex?forum=vclanguage)