Функция CreateThread

Функция CreateThread создает поток, который выполняется в пределах виртуального адресного пространства вызывающего процесса.

Чтобы создавать поток, который запускается в виртуальном адресном пространстве другого процесса, используется функция CreateRemoteThread.

Синтаксис

HANDLE CreateThread(

LPSECURITY_ATTRIBUTES lpThreadAttributes, // дескриптор защиты
SIZE_T
dwStackSize,                       // начальный размер стека
LPTHREAD_START_ROUTINE
lpStartAddress,    // функция потока
LPVOID
lpParameter,                       // параметр потока
DWORD
dwCreationFlags,                    // опции создания
LPDWORD
lpThreadId                        // идентификатор потока

);

Параметры

lpThreadAttributes

[in] Указатель на структуру SECURITY_ATTRIBUTES, которая обуславливает, может ли возвращенный дескриптор быть унаследован дочерними процессами. Если lpThreadAttributes является значением ПУСТО (NULL), дескриптор не может быть унаследован.

Windows NT/2000/XP: член структуры lpSecurityDescriptor определяет дескриптор безопасности для нового потока. Если lpThreadAttributes имеет значение ПУСТО (NULL), поток получает заданный по умолчанию дескриптор защиты. Списки контроля доступа (ACL) в заданном по умолчанию дескрипторе безопасности для потока поступают из первичного маркера или маркера заимствования прав создателя.

dwStackSize

[in] Начальный размер стека, в байтах. Система округляет это значение до самой близкой страницы памяти. Если это значение нулевое, новый поток использует по умолчанию размер стека исполняемой программы. Дополнительную информацию см. в статье Размер стека потока

Обратите внимание! на то, что, в случае необходимости, размер стека растет.

lpStartAddress

[in] Указатель на определяемую программой функцию типа LPTHREAD_START_ROUTINE, код которой исполняется потоком и обозначает начальный адрес потока. Для получения дополнительной информации о функции потока, см. ThreadProc.

lpParameter

[in] Указатель на переменную, которая передается в поток.

dwCreationFlags

[in] Флажки, которые управляют созданием потока. Если установлен флажок CREATE_SUSPENDED, создается поток в состоянии ожидания и не запускается до тех пор, пока не будет вызвана функция ResumeThread. Если это значение нулевое, поток запускается немедленно после создания. В это время, никакие другие значения не поддерживаются.

Windows XP: Если установлен флажок STACK_SIZE_PARAM_IS_A_RESERVATION, параметр dwStackSize задает начальный резервный размер стека. Иначе, dwStackSize устанавливает фиксированный размер.

lpThreadId

[out] Указатель на переменную, которая принимает идентификатор потока.

Windows NT /2000/XP: Если этот параметр имеет значение ПУСТО (NULL), идентификатор потока не возвращается.

Windows 95/98/Me: Этот параметр не может быть значением ПУСТО (NULL).

Возвращаемые значения

Если функция завершается успешно, величина возвращаемого значения - дескриптор нового потока.

Если функция завершается с ошибкой, величина возвращаемого значения - ПУСТО (NULL). Чтобы получать дополнительные данные об ошибках, вызовите GetLastError.

Обратите внимание!, что функция CreateThread может завершиться успешно, даже если lpStartAddress указывает на данные, код или не понятно куда. Если ее начальный адрес ошибочен, когда поток запускается, происходит исключительная ситуация и поток заканчивает работу. Завершение работы потока в результате недопустимого начального адреса обрабатывается как выход из-за ошибки для процесса потока. Это поведение похоже на асинхронный характер CreateProcess, где процесс создается, даже если он адресуется к ошибочным или отсутствующим библиотекам динамической связи (DLL).

Windows 95/98/Me: функция CreateThread завершается успешно, только тогда, когда она вызвана в контексте 32-разрядной программы. 32-разрядная DLL не может создать дополнительный поток, когда эта DLL вызывается 16-разрядной программой.

Замечания

Число потоков, которые процесс может создать, ограничено доступной виртуальной памятью. По умолчанию, каждый поток имеет один мегабайт пространства стека. Поэтому, Вы можете создавать самое большое 2028 потоков. Если Вы преобразовываете заданный по умолчанию размер стека, Вы можете создавать большее количество потоков. Однако ваше приложение будет иметь лучшую эффективность, если Вы создаете один поток на процессор и выстраиваете очередь запросов, которые приложение сохраняют информацию контекста. Поток должен обрабатывать все запросы в очереди перед обработкой запросов следующей очереди.

Новый дескриптор потока создается с правами доступа THREAD_ALL_ACCESS. Если дескриптор безопасности не предоставляется, этот дескриптор может быть использован в любой функции, которая требует дескриптора объекта потока. Когда дескриптор безопасности предоставлен, проверка доступа выполняется для всех последующих использованиях дескриптора прежде, чем этот доступ предоставляется. Если проверка доступа не запрещает доступ, запрашивающий процесс не может использовать дескриптор, чтобы получить доступ к потоку. Если поток исполняет роль клиента, то он вызывает CreateThread с дескриптором безопасности имеющим значение ПУСТО (NULL), созданный объект потока имеет заданный по умолчанию дескриптор безопасности, который позволяет доступ только владельцу маркера заимствования прав или членам TokenDefaultDacl. Для получения дополнительной информации, см. статью Защита потока и права доступа.

Выполнение потока начинается в функции, указанной параметром lpStartAddress . Если эта функция возвращает значение, величина возвращаемого значения ДВОЙНОЕ СЛОВО (DWORD) используется, чтобы завершить работу потока неявным вызовом функции ExitThread. Чтобы получить величину возвращаемого значения потока, используйте функцию GetExitCodeThread.

Поток создается с приоритетом потока THREAD_PRIORITY_NORMAL. Используйте функции GetThreadPriority и SetThreadPriority, чтобы получать и установить приоритетное значение потока.

Когда поток заканчивает работу, объект потока приобретает сигнального состояния, удовлетворяя любые потоки, которые ждали объект.

Объект потока остается в системе, до тех пор, пока не поток закончит работу, и все дескрипторы к нему не будут закрыты через вызов CloseHandle.

Функции ExitProcess, ExitThread, CreateThread, CreateRemoteThread и процесс, который запускается (как результат вызова CreateProcess), в пределах процесса переводятся между собой в последовательный режим. Одновременно в адресном пространстве может происходить только одно из этих событий. Это означает нижеследующие ограничения выполнения:

  • В ходе запуска процесса и процедуры инициализации DLL, новые потоки могут быть созданы, но они не начинают исполнение кода до тех пор, пока не будет сделана инициализация DLL для процесса.
  • Одновременно только один поток в процессе может быть инициализирован или отключен процедурой в DLL.
  • Функция ExitProcess не возвращает значения до тех пор, пока в потоках не отработают в их DLL процедуры инициализации или отключения.

Поток, который использует функции из библиотек этапа исполнения C, для управления потоком должен использовать C - функции этапа исполнения beginthread и endthread, а не CreateThread и ExitThread. Когда вызывается ExitThread, происходит утечка ресурсов в маленькой памяти, что приводит к сбою в программе.

Смотри также

Краткий обзор Процессы и потоки, Функции, используемые процессами и потоками, CloseHandle, CreateProcess, CreateRemoteThread, ExitProcess, ExitThread, GetExitCodeThread, GetThreadPriority, ResumeThread, SetThreadPriority, SECURITY_ATTRIBUTES, ThreadProc

Размещение и совместимость CreateThread

Windows. NET Server

Да

Windows XP

Да

Windows 2000

Да

Windows NT

Да

Windows Me

Да

Windows 98

Да

Windows 95

Да

Используемая библиотека

User32.lib

Заголовочный файл

 

- объявлено в

Winbase.h

- включено в

Windows.h

Unicode

Нет

Замечания по платформе

Не имеется

 

Назад в оглавление
На главную страницу
На оглавление справки

Hosted by uCoz