Freigeben über


CreateThread-Funktion (processthreadsapi.h)

Erstellt einen Thread, der innerhalb des virtuellen Adressraums des aufrufenden Prozesses ausgeführt werden soll.

Um einen Thread zu erstellen, der im virtuellen Adressbereich eines anderen Prozesses ausgeführt wird, verwenden Sie die CreateRemoteThread--Funktion.

Syntax

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
);

Parameter

[in, optional] lpThreadAttributes

Ein Zeiger auf eine SECURITY_ATTRIBUTES Struktur, die bestimmt, ob das zurückgegebene Handle von untergeordneten Prozessen geerbt werden kann. Wenn lpThreadAttributes NULL ist, kann das Handle nicht geerbt werden.

Der lpSecurityDescriptor Element der Struktur gibt einen Sicherheitsdeskriptor für den neuen Thread an. Wenn lpThreadAttributes NULL ist, erhält der Thread einen Standardsicherheitsdeskriptor. Die ACLs im Standardsicherheitsdeskriptor für einen Thread stammen aus dem primären Token des Erstellers.

[in] dwStackSize

Die Anfangsgröße des Stapels in Byte. Das System rundet diesen Wert auf die nächste Seite. Wenn dieser Parameter null ist, verwendet der neue Thread die Standardgröße für die ausführbare Datei. Weitere Informationen finden Sie unter Threadstapelgröße.

[in] lpStartAddress

Ein Zeiger auf die anwendungsdefinierte Funktion, die vom Thread ausgeführt werden soll. Dieser Zeiger stellt die Startadresse des Threads dar. Weitere Informationen zur Threadfunktion finden Sie unter ThreadProc-.

[in, optional] lpParameter

Ein Zeiger auf eine Variable, die an den Thread übergeben werden soll.

[in] dwCreationFlags

Die Flags, die die Erstellung des Threads steuern.

Wert Bedeutung
0
Der Thread wird unmittelbar nach der Erstellung ausgeführt.
CREATE_SUSPENDED
0x00000004
Der Thread wird in einem angehaltenen Zustand erstellt und wird erst ausgeführt, wenn die ResumeThread--Funktion aufgerufen wird.
STACK_SIZE_PARAM_IS_A_RESERVATION
0x00010000
Der dwStackSize Parameter gibt die anfängliche Reservegröße des Stapels an. Wenn dieses Flag nicht angegeben ist, gibt dwStackSize die Commit-Größe an.

[out, optional] lpThreadId

Ein Zeiger auf eine Variable, die den Threadbezeichner empfängt. Wenn dieser Parameter NULL-ist, wird der Threadbezeichner nicht zurückgegeben.

Rückgabewert

Wenn die Funktion erfolgreich ist, ist der Rückgabewert ein Handle für den neuen Thread.

Wenn die Funktion fehlschlägt, ist der Rückgabewert NULL-. Rufen Sie GetLastErrorauf, um erweiterte Fehlerinformationen zu erhalten.

Beachten Sie, dass CreateThread- möglicherweise erfolgreich ist, auch wenn lpStartAddress auf Daten, Code verweist oder nicht darauf zugegriffen werden kann. Wenn die Startadresse ungültig ist, wenn der Thread ausgeführt wird, tritt eine Ausnahme auf, und der Thread wird beendet. Threadendung aufgrund einer ungültigen Startadresse wird als Fehlerausgang für den Threadprozess behandelt. Dieses Verhalten ähnelt der asynchronen Art von CreateProcess, bei der der Prozess erstellt wird, auch wenn er auf ungültige oder fehlende Dynamic Link Libraries (DLLs) verweist.

Bemerkungen

Die Anzahl der Threads, die ein Prozess erstellen kann, ist durch den verfügbaren virtuellen Speicher begrenzt. Standardmäßig verfügt jeder Thread über ein Megabyte Stapelspeicher. Daher können Sie nicht 2.048 oder mehr Threads auf einem 32-Bit-System ohne /3GB boot.ini Option erstellen. Wenn Sie die Standardstapelgröße verringern, können Sie weitere Threads erstellen. Ihre Anwendung hat jedoch eine bessere Leistung, wenn Sie einen Thread pro Prozessor erstellen und Warteschlangen von Anforderungen erstellen, für die die Anwendung die Kontextinformationen verwaltet. Ein Thread würde alle Anforderungen in einer Warteschlange verarbeiten, bevor Anforderungen in der nächsten Warteschlange verarbeitet werden.

Das neue Threadhandle wird mit dem THREAD_ALL_ACCESS Zugriffsrecht erstellt. Wenn beim Erstellen des Threads kein Sicherheitsdeskriptor bereitgestellt wird, wird ein Standardsicherheitsdeskriptor für den neuen Thread mithilfe des primären Tokens des Prozesses erstellt, der den Thread erstellt. Wenn ein Aufrufer versucht, auf den Thread mit der OpenThread--Funktion zuzugreifen, wird das effektive Token des Aufrufers anhand dieses Sicherheitsdeskriptors ausgewertet, um den Zugriff zu gewähren oder zu verweigern.

Der neu erstellte Thread verfügt über Vollzugriffsrechte für sich selbst, wenn die GetCurrentThread--Funktion aufgerufen wird.

Windows Server 2003: Die Zugriffsrechte für den Thread selbst werden berechnet, indem das primäre Token des Prozesses ausgewertet wird, in dem der Thread mit dem für den Thread erstellten Standardsicherheitsdeskriptor erstellt wurde. Wenn der Thread in einem Remoteprozess erstellt wird, wird das primäre Token des Remoteprozesses verwendet. Daher kann der neu erstellte Thread beim Aufrufen GetCurrentThread-eingeschränkte Zugriffsrechte für sich selbst haben. Einige Zugriffsrechte, einschließlich THREAD_SET_THREAD_TOKEN und THREAD_GET_CONTEXT, sind möglicherweise nicht vorhanden, was zu unerwarteten Fehlern führt. Aus diesem Grund wird das Erstellen eines Threads beim Identitätswechsel eines anderen Benutzers nicht empfohlen.

Wenn der Thread in einem ausführungsfähigen Zustand erstellt wird (d. h., wenn das CREATE_SUSPENDED Flag nicht verwendet wird), kann der Thread vor CreateThread- zurückgegeben werden und insbesondere bevor der Aufrufer das Handle und den Bezeichner des erstellten Threads empfängt.

Die Threadausführung beginnt bei der funktion, die durch den parameter lpStartAddress angegeben wird. Wenn diese Funktion zurückgegeben wird, wird der DWORD- Rückgabewert verwendet, um den Thread in einem impliziten Aufruf der ExitThread--Funktion zu beenden. Verwenden Sie die GetExitCodeThread--Funktion, um den Rückgabewert des Threads abzurufen.

Der Thread wird mit einer Threadpriorität von THREAD_PRIORITY_NORMALerstellt. Verwenden Sie die "GetThreadPriority"- und "SetThreadPriority" Funktionen, um den Prioritätswert eines Threads abzurufen und festzulegen.

Wenn ein Thread beendet wird, erreicht das Threadobjekt einen signalisierten Zustand und erfüllt alle Threads, die auf das Objekt warten.

Das Threadobjekt verbleibt im System, bis der Thread beendet wurde, und alle Handles wurden über einen Aufruf von CloseHandlegeschlossen.

Die ExitProcess, ExitThread, CreateThread, CreateRemoteThread Funktionen und ein Prozess, der gestartet wird (als Ergebnis eines Aufrufs durch CreateProcess) werden innerhalb eines Prozesses zwischeneinander serialisiert. Nur eines dieser Ereignisse kann jeweils in einem Adressraum stattfinden. Dies bedeutet, dass die folgenden Einschränkungen gelten:

  • Während der Prozessstart- und DLL-Initialisierungsroutinen können neue Threads erstellt werden, aber sie beginnen erst mit der Ausführung der DLL-Initialisierung für den Prozess.
  • Nur ein Thread in einem Prozess kann sich gleichzeitig in einer DLL-Initialisierung oder einer Detachierungsroutine befindet.
  • ExitProcess wird erst abgeschlossen, wenn keine Threads in der DLL-Initialisierung vorhanden sind oder Routinen trennen.
Ein Thread in einer ausführbaren Datei, der die C-Laufzeitbibliothek (C Run-Time Library, CRT) aufruft, sollte die _beginthreadex- und _endthreadex-Funktionen für die Threadverwaltung anstelle CreateThread- und ExitThread-verwenden; dies erfordert die Verwendung der Multithreadversion des CRT. Wenn ein mit CreateThread erstellter Thread crT aufruft, kann der CRT den Prozess unter geringen Arbeitsspeicherbedingungen beenden.

Windows Phone 8.1: Diese Funktion wird für Windows Phone Store-Apps unter Windows Phone 8.1 und höher unterstützt.

Windows 8.1 und Windows Server 2012 R2: Diese Funktion wird für Windows Store-Apps unter Windows 8.1, Windows Server 2012 R2 und höher unterstützt.

Beispiele

Ein Beispiel finden Sie unter Erstellen von Threads.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Windows XP [Desktop-Apps | UWP-Apps]
mindestens unterstützte Server- Windows Server 2003 [Desktop-Apps | UWP-Apps]
Zielplattform- Fenster
Header- processthreadsapi.h (include Windows.h on Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2)
Library Kernel32.lib; WindowsPhoneCore.lib unter Windows Phone 8.1
DLL- Kernel32.dll; KernelBase.dll unter Windows Phone 8.1

Siehe auch

CloseHandle-

CreateProcess-

CreateRemoteThread-

ExitProcess-

ExitThread-

GetExitCodeThread-

GetThreadPriority-

Prozess- und Threadfunktionen

ResumeThread-

SECURITY_ATTRIBUTES

SetThreadPriority-

SuspendThread-

ThreadProc-

Threads