Поделиться через


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, дескриптор не может быть унаследован.

Элемент lpSecurityDescriptor в структуре задает дескриптор безопасности для нового потока. Если lpThreadAttributes имеет значение NULL, поток получает дескриптор безопасности по умолчанию. Списки управления доступом в дескрипторе безопасности по умолчанию для потока приходят из основного маркера создателя.

[in] dwStackSize

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

[in] lpStartAddress

Указатель на определяемую приложением функцию, выполняемую потоком. Этот указатель представляет начальный адрес потока. Дополнительные сведения о функции потока см. в ThreadProc.

[in, optional] lpParameter

Указатель на переменную, передаваемую потоку.

[in] dwCreationFlags

Флаги, управляющие созданием потока.

Ценность Значение
0
Поток выполняется сразу после создания.
CREATE_SUSPENDED
0x00000004
Поток создается в приостановленном состоянии и не запускается до вызова функции ResumeThread.
STACK_SIZE_PARAM_IS_A_RESERVATION
0x00010000
Параметр dwStackSize указывает начальный размер резерва стека. Если этот флаг не указан, 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 используется для завершения потока в неявном вызове функции ExitThread. Используйте функцию GetExitCodeThread, чтобы получить возвращаемое значение потока.

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

После завершения потока объект потока достигает сигнального состояния, удовлетворяющего всем потокам, ожидающим объекта.

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

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

  • Во время запуска процесса и подпрограмм инициализации DLL можно создать новые потоки, но они не начинают выполняться до тех пор, пока не будет выполнена инициализация БИБЛИОТЕК DLL для процесса.
  • Только один поток в процессе может находиться в инициализации библиотеки DLL или отсоединить подпрограмму одновременно.
  • ExitProcess не завершается до тех пор, пока в инициализации библиотеки DLL нет потоков или отсоединять подпрограммы.
Поток в исполняемом файле, который вызывает библиотеку времени выполнения C (CRT), должен использовать функции _beginthreadex и _endthreadex для управления потоками, а не CreateThread и ExitThread; для этого требуется использование многопоточной версии CRT. Если поток, созданный с помощью CreateThread вызывает CRT, CRT может завершить процесс в условиях низкой памяти.

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

См. также

CloseHandle

CreateProcess

CreateRemoteThread

ExitProcess

ExitThread

GetExitCodeThread

GetThreadPriority

функции процессов и потоков

ResumeThread

SECURITY_ATTRIBUTES

SetThreadPriority

Приостановка

ThreadProc

потоки