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 |
---|---|
|
Der Thread wird unmittelbar nach der Erstellung ausgeführt. |
|
Der Thread wird in einem angehaltenen Zustand erstellt und erst ausgeführt, wenn die ResumeThread-Funktion aufgerufen wird. |
|
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.
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 |