CreateThread function (processthreadsapi.h)
Создает поток для выполнения в виртуальном адресном пространстве вызывающего процесса.
Чтобы создать поток, который выполняется в виртуальном адресном пространстве другого процесса, используйте функцию CreateRemoteThread.
Синтаксис
HANDLE CreateThread(
[in, optional] LPSECURITY_ATTRIBUTES lpThreadAttributes,
[in] SIZE_T dwStackSize,
[in] LPTHREAD_START_ROUTINE lpStartAddress,
[in, optional] __drv_aliasesMem LPVOID lpParameter,
[in] DWORD dwCreationFlags,
[out, optional] LPDWORD lpThreadId
);
Параметры
[in, optional] lpThreadAttributes
Указатель на структуру SECURITY_ATTRIBUTES, которая определяет, может ли возвращаемый дескриптор наследоваться дочерними процессами. Если lpThreadAttributes имеет значение NULL, дескриптор не может быть унаследован.
Элемент
[in] dwStackSize
Начальный размер стека в байтах. Система округляет это значение до ближайшей страницы. Если этот параметр равен нулю, новый поток использует размер по умолчанию для исполняемого файла. Дополнительные сведения см. в разделе Размер стека потоков.
[in] lpStartAddress
Указатель на определяемую приложением функцию, выполняемую потоком. Этот указатель представляет начальный адрес потока. Дополнительные сведения о функции потока см. в ThreadProc.
[in, optional] lpParameter
Указатель на переменную, передаваемую потоку.
[in] dwCreationFlags
Флаги, управляющие созданием потока.
Ценность | Значение |
---|---|
|
Поток выполняется сразу после создания. |
|
Поток создается в приостановленном состоянии и не запускается до вызова функции ResumeThread. |
|
Параметр dwStackSize |
[out, optional] lpThreadId
Указатель на переменную, которая получает идентификатор потока. Если этот параметр null, идентификатор потока не возвращается.
Возвращаемое значение
Если функция завершается успешно, возвращаемое значение является дескриптором нового потока.
Если функция завершается ошибкой, возвращаемое значение равно NULL. Чтобы получить расширенные сведения об ошибке, вызовите GetLastError.
Обратите внимание, что CreateThread может завершиться успешно, даже если lpStartAddress указывает на данные, код или недоступно. Если начальный адрес недопустим при выполнении потока, возникает исключение и поток завершается. Завершение потока из-за недопустимого адреса запуска обрабатывается как выход из ошибки для процесса потока. Это поведение аналогично асинхронной природе CreateProcess, где создается процесс, даже если он ссылается на недопустимые или отсутствующие библиотеки динамических ссылок (DLL).
Замечания
Количество потоков, которые может создать процесс, ограничено доступной виртуальной памятью. По умолчанию каждый поток имеет один мегабайт пространства стека. Поэтому невозможно создать 2048 или более потоков в 32-разрядной системе без /3GB
boot.ini параметра. Если уменьшить размер стека по умолчанию, можно создать дополнительные потоки. Однако приложение будет иметь лучшую производительность при создании одного потока на процессор и очередях сборок запросов, для которых приложение сохраняет сведения о контексте. Поток будет обрабатывать все запросы в очереди перед обработкой запросов в следующей очереди.
Новый дескриптор потока создается с помощью права доступа THREAD_ALL_ACCESS. Если дескриптор безопасности не указан при создании потока, дескриптор безопасности по умолчанию создается для нового потока с помощью основного маркера процесса, создающего поток. Когда вызывающий объект пытается получить доступ к потоку с помощью функции OpenThread OpenTh read, эффективный маркер вызывающего объекта вычисляется в отношении этого дескриптора безопасности для предоставления или запрета доступа.
Только что созданный поток имеет права доступа к себе при вызове функции GetCurrentThread.
Windows Server 2003: права доступа потока к самому себе вычисляются путем оценки основного маркера процесса, в котором поток был создан на основе дескриптора безопасности по умолчанию, созданного для потока. Если поток создается в удаленном процессе, используется первичный маркер удаленного процесса. В результате только что созданный поток может иметь права доступа к себе при вызове GetCurrentThread. Некоторые права доступа, включая THREAD_SET_THREAD_TOKEN и THREAD_GET_CONTEXT, могут не присутствовать, что приводит к непредвиденным сбоям. По этой причине создание потока во время олицетворения другого пользователя не рекомендуется.
Если поток создается в состоянии запуска (т. е. если флаг CREATE_SUSPENDED не используется), поток может запуститься перед возвратом CreateThread и, в частности, прежде чем вызывающий объект получит дескриптор и идентификатор созданного потока.
Выполнение потока начинается с функции, указанной параметром lpStartAddress. Если эта функция возвращается, значение DWORD
Поток создается с приоритетом потока THREAD_PRIORITY_NORMAL. Используйте
После завершения потока объект потока достигает сигнального состояния, удовлетворяющего всем потокам, ожидающим объекта.
Объект потока остается в системе, пока поток не завершится, и все дескрипторы к нему были закрыты через вызов CloseHandle.
ExitProcess, ExitThread, CreateThread, CreateRemoteThread функции и процесс, который запускается (в результате вызова CreateProcess) сериализуются между собой в процессе. Только одно из этих событий может происходить в адресном пространстве одновременно. Это означает, что удерживают следующие ограничения:
- Во время запуска процесса и подпрограмм инициализации DLL можно создать новые потоки, но они не начинают выполняться до тех пор, пока не будет выполнена инициализация БИБЛИОТЕК DLL для процесса.
- Только один поток в процессе может находиться в инициализации библиотеки DLL или отсоединить подпрограмму одновременно.
- ExitProcess не завершается до тех пор, пока в инициализации библиотеки DLL нет потоков или отсоединять подпрограммы.
Windows Phone 8.1: Эта функция поддерживается для приложений Магазина Windows Phone в Windows Phone 8.1 и более поздних версиях.
Windows 8.1 и Windows Server 2012 R2: эта функция поддерживается для приложений Магазина Windows в Windows 8.1, Windows Server 2012 R2 и более поздних версий.
Примеры
Пример см. в статье Создание потоков.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Windows XP [классические приложения | Приложения UWP] |
минимальный поддерживаемый сервер | Windows Server 2003 [классические приложения | Приложения UWP] |
целевая платформа | Виндоус |
заголовка | processthreadsapi.h (включая Windows.h в Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2) |
библиотеки |
Kernel32.lib; WindowsPhoneCore.lib в Windows Phone 8.1 |
DLL | Kernel32.dll; KernelBase.dll в Windows Phone 8.1 |