CreateThread-Funktion (processthreadsapi.h)

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

Verwenden Sie die CreateRemoteThread-Funktion , um einen Thread zu erstellen, der im virtuellen Adressraum eines anderen Prozesses ausgeführt wird.

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-Member 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 anfängliche Größe des Stapels in Bytes. 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 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 Commitgröß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 bei der Funktion ein Fehler auftritt, ist der Rückgabewert NULL. Um erweiterte Fehlerinformationen zu erhalten, rufen Sie GetLastError auf.

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

Hinweise

Die Anzahl der Threads, die ein Prozess erstellen kann, wird durch den verfügbaren virtuellen Arbeitsspeicher begrenzt. Standardmäßig verfügt jeder Thread über ein Megabyte Stapelspeicherplatz. Daher können Sie ohne /3GB boot.ini Option nicht 2.048 oder mehr Threads in einem 32-Bit-System erstellen. Wenn Sie die Standardstapelgröße verringern, können Sie weitere Threads erstellen. Ihre Anwendung bietet jedoch eine bessere Leistung, wenn Sie einen Thread pro Prozessor erstellen und Warteschlangen mit 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 Zugriffsrecht THREAD_ALL_ACCESS 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, mit der OpenThread-Funktion auf den Thread zuzugreifen, wird das effektive Token des Aufrufers für diesen Sicherheitsdeskriptor ausgewertet, um den Zugriff zu gewähren oder zu verweigern.

Der neu erstellte Thread verfügt beim Aufrufen der GetCurrentThread-Funktion über Vollzugriffsrechte für sich selbst.

Windows Server 2003: Die Zugriffsrechte des Threads für sich selbst werden berechnet, indem das primäre Token des Prozesses, in dem der Thread erstellt wurde, anhand des für den Thread erstellten Standardsicherheitsdeskriptors ausgewertet wird. Wenn der Thread in einem Remoteprozess erstellt wird, wird das primäre Token des Remoteprozesses verwendet. Daher verfügt der neu erstellte Thread möglicherweise über eingeschränkte Zugriffsrechte für sich selbst, wenn GetCurrentThread aufgerufen wird. 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 Annehmen der Identität eines anderen Benutzers nicht empfohlen.

Wenn der Thread in einem ausführungsfähigen Zustand erstellt wird (d. h. wenn das flag CREATE_SUSPENDED nicht verwendet wird), kann der Thread mit der Ausführung beginnen, bevor CreateThread zurückgibt 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 lpStartAddress-Parameter angegeben wird. Wenn diese Funktion zurückgibt, 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 der Threadpriorität THREAD_PRIORITY_NORMAL erstellt. Verwenden Sie die Funktionen GetThreadPriority und SetThreadPriority , um den Prioritätswert eines Threads abzurufen und festzulegen.

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

Das Threadobjekt verbleibt im System, bis der Thread beendet wurde und alle Handles dafür durch einen Aufruf von CloseHandle geschlossen wurden.

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

  • Während der Prozessstart- und DLL-Initialisierungsroutinen können neue Threads erstellt werden, sie beginnen jedoch erst mit der Ausführung, wenn die DLL-Initialisierung für den Prozess abgeschlossen ist.
  • Nur ein Thread in einem Prozess kann gleichzeitig in einer DLL-Initialisierungs- oder Detachroutine enthalten sein.
  • ExitProcess wird erst abgeschlossen, wenn keine Threads in ihren DLL-Initialisierungs- oder Trennroutinen vorhanden sind.
Ein Thread in einer ausführbaren Datei, der die C-Laufzeitbibliothek (CRT) aufruft, sollte die funktionen _beginthreadex und _endthreadex für die Threadverwaltung anstelle von CreateThread und ExitThread verwenden. Dies erfordert die Verwendung der Multithreadversion der CRT. Wenn ein mit CreateThread erstellter Thread die CRT aufruft, kann die CRT den Prozess unter Bedingungen mit geringem Arbeitsspeicher beenden.

Windows Phone 8.1: Diese Funktion wird für Windows Phone Store-Apps ab Windows Phone 8.1 unterstützt.

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

Beispiele

Ein Beispiel finden Sie unter Erstellen von Threads.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows XP [Desktop-Apps | UWP-Apps]
Unterstützte Mindestversion (Server) Windows Server 2003 [Desktop-Apps | UWP-Apps]
Zielplattform Windows
Kopfzeile processthreadsapi.h (enthalten Windows.h unter Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2)
Bibliothek Kernel32.lib; WindowsPhoneCore.lib auf Windows Phone 8.1
DLL Kernel32.dll; KernelBase.dll am Windows Phone 8.1

Weitere Informationen

CloseHandle

CreateProcess

CreateRemoteThread

ExitProcess

ExitThread

GetExitCodeThread

GetThreadPriority

Prozess- und Threadfunktionen

ResumeThread

SECURITY_ATTRIBUTES

SetThreadPriority

SuspendThread

ThreadProc

Threads