Главная arrow С++ (часть 3) arrow Альтернативы API-функций создания и завершения потока, предлагаемые компилятором Visual С++

Альтернативы API-функций создания и завершения потока, предлагаемые компилятором Visual С++

Несмотря на ТО, ЧТО функции CreateThread ()   И ExitThread ()   ЯВЛЯЮТСЯ
API-функциями операционной системы Windows для создания и завершения потока, мы не будем их использовать в этой главе. Применяемые с компилятором Visual С++ (и, возможно, с другими Windows-совместимыми компиляторами), они вызывают утечки памяти, потерю небольшого объема памяти. В среде программирования Visual С++, если многопоточная программа использует совместно со стандартной библиотекой функций C/C++
ФУНКЦИИ CreateThread ()  И ExitThread (), Теряется небольшое количество
памяти (если в вашей программе не применяется стандартная библиотека функций, то таких потерь не возникает). Для устранения этой проблемы вам следует использовать функции, определенные в стандартной библиотеке Visual С++ для создания и остановки потоков, вместо описанных ранее API-функций. ЭТИ ФУНКЦИИ аналогичны ФУНКЦИЯМ CreateThread() И ExitThread (), но не приводят к потерям памяти.
^   Примечание   ^
Если вы пользуетесь другим компилятором, не Visual С++, прочитайте документацию, чтобы ВЫЯСНИТЬ, нужно ЛИ вам заменить функции CreateThread () и ExitThread (), и как это сделать.
Альтернативные ФУНКЦИИ Visual С++ — _beginthreadex()  И _endthreadex ().
Обеим требуется заголовочный файл <process.h>. Далее приводится прототип ДЛЯ функции _beginthreadex ().
uintptr_t_beginthreadex(void *secAttr,unsigned stackSize,
unsigned (_stdcall *threadFunc)(void *),
void *param,unsigned flags, unsigned *threadID);
Как видно, параметры функции _beginthreadex () очень похожи на параметры функции CreateThread (). Более того, у них то же назначение, что и У параметров функции createThreado. Параметр secAttr — это указатель на множество атрибутов защиты, принадлежащих потоку. Если указатель secAttr равен NULL, ТО используется дескриптор защиты по умолчанию. Размер в байтах стека для нового потока передается в параметре stacksize.
Если этот размер задан нулевым, то стек потока равен размеру основного потока в процессе, который его создает.
Адрес функции потока (которая является точкой входа для потока) указывается В параметре threadFunc. ДЛЯ функции _beginthreadex()  фунКПИЯ ПО-
тока имеет следующий прототип:
unsigned   stdcall threadfunc(void *param);
Этот прототип функционально эквивалентен прототипу функции потока для createThreado, но в нем используются другие имена типов. Любой аргумент, который вы хотите передать новому потоку, описывается в параметре
С именем param.
Параметр flags определяет состояние выполнения потока. Если он равен нулю, то поток начинает выполняться немедленно. Если его значение равно константе CREATE_SUSPEND, ПОТОК создается в отложенном состоянии, ожидая   ВЫПОЛНенИЯ  (его  МОЖНО  начать,   ВЫЗВаВ  фунКЦИЮ  ResumeThread ()).
Идентификатор, связанный с потоком, возвращается в двойном слове, на которое указывает параметр threadm
Функция при успешном выполнении возвращает дескриптор потока, а при возникновении ошибки     0. Тип uintptr_t определяет тип Visual С++, способный хранить указатель или дескриптор. Далее показан ПРОТОТИП ФУНКЦИИ _endthreadex (): Void_endthreadex(unsigned status);
Функция действует так же, как ExitThreadO, останавливая поток и возвращая статус его завершения.
Поскольку компилятор Visual С++ — наиболее часто используемый компилятор в операционной системе Windows, в примерах этой главы будут применяться функции _beginthreadex() и _endthreadex о, а не эквивалентные им API-функции. Если вы используете другой компилятор, не Visual С++,
Просто замените ИХ ФУНКЦИЯМИ CreateThread() И ExitThreadO. Применяя ФУНКЦИИ _beginthreadex () И _endthreadex (), ПОМНИТв О необходимости при компоновке использовать библиотеку поддержки многопоточности. Способы ее подключения могут быть разными у различных компиляторов. Если вы применяете компилятор Visual С++, работающий в режиме командной строки, включите в строку ключ -мт. В среде программирования Visual С++6 выполните следующие действия.
1. Выберите в меню команду Project | Settings (Проект | Установки).
2. В открывшемся окне перейдите на вкладку С\С++.
3. В списке Category (Категория) выберите Code Generation (Генерация кода).
4. В списке Use Runtime Library (Использовать динамическую библиотеку) укажите Multithreaded (Поддерживающая многопоточность).
JJ среДе Visual C++7/NET следует выполнить те же действия, только в меню вЫбрать команду Project | Properties (Проект | Свойства).