|
|
|
| |
Главная С++ (часть 3) Альтернативы 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 (Проект | Свойства).
|
|
|
|
|