_beginthreadex
Nach oben zu Process.h - Index
Header-Datei
process.h
Kategorie
Prozesssteuerungsroutinen
Prototyp
unsigned long _beginthreadex(void *__security_attr, unsigned __stksize, unsigned (__stdcall *__start)(void *), void *__arg, unsigned __create_flags, unsigned *__thread_id);
Beschreibung
Erstellt einen Thread und erlaubt, die anderen Parameter für die API-Funktion CreateThread des Betriebssystems (etwa Sicherheits- und Thread-Erstellungsflags) anzugeben. Die Funktion _endthreadex wird automatisch aufgerufen, sobald die Thread-Funktion endet. Der von Ihrer Thread-Funktion zurückgegebene Wert wird an _endthreadex übergeben, die ihn ihrerseits der API-Funktion ExitThread übergibt. Der Rückgabewert kann dann mit der API-Funktion GetExitCodeThread bezogen werden.
Im Unterschied zu _endthread schließt die Funktion _endthreadex das Thread-Handle nicht, und ermöglicht damit anderen Threads, diesen Thread zu sperren, ohne befürchten zu müssen, dass das Handle unter der Hand von System freigegeben wird.
Die Reihenfolge der Parameter und das Nicht-Schließen des Handles ausgenommen, führt _beginthreadex die gleiche Operation wie _beginthreadNT durch.
Anmerkung: Die Startadresse muss definiert sein, damit ein nicht vorzeichenbehafteter Wert als Exitcode des Thread zurückgegeben werden kann.
Rückgabewert
_beginthreadex gibt das Handle des neuen Thread zurück. Der Rückgabewert ist ein Standard-Windows-Handle, das für die API-Funktionen des Betriebssystems, etwa SuspendThread und ResumeThread verwendet werden kann..
Wenn nicht erfogreich, wird 0 zurückgegeben und errno auf einen der folgenden Werte gesetzt:
EAGAIN |
Too many threads (Zu viele Threads) |
ENOMEM |
Not enough memory (Speicher nicht ausreichend) |
EINVAL |
Bad stack size (Ungültige Stack-Größe, also weniger als 16 Byte oder Null) |
Siehe auch die Beschreibung der Win32-API-Funktion GetLastError in der MSDN-Dokumentation.
Beispiel
//* Verwenden Sie für dieses Beispiel die Kommandozeilenoption -tWM (32-Bit Multi-Thread-Ziel) */
#pragma checkoption -tWM
#include <windows.h>
#include <process.h>
#include <stdio.h>
#define NTHREADS 25
/* Diese Funktion fungiert als die Funktion 'main' für jeden neuen Thread */
static unsigned __stdcall threadMain(void *arg)
{
printf("Thread %2d has an ID of %u\n", (int)arg, GetCurrentThreadId());
return 0;
}
int main(void)
{
HANDLE hThreads[NTHREADS];
int i;
unsigned threadId;
SECURITY_ATTRIBUTES sa = {
sizeof(SECURITY_ATTRIBUTES), /* Strukturgröße */
0, /* Kein Sicherheitsdeskriptor */
TRUE /* Thread-Handle ist vererbbar */
};
/* NTHREADS vererbbare Threads erstellen, die zunächst ausgesetzt sind und die beginnend mit threadMain() ausgeführt werden */
for(i = 0; i < NTHREADS; i++) {
hThreads[i] = (HANDLE)_beginthreadex(
&sa, /* Thread-Sicherheit */
4096, /* Thread-Stack-Größe */
threadMain, /* Thread-Startadresse */
(void *)i, /* Thread-Startargument */
CREATE_SUSPENDED, /* Erstellung im ausgesetzten Zustand */
&threadId); /* Thread-ID */
if(hThreads[i] == INVALID_HANDLE_VALUE) {
MessageBox(0, "Thread Creation Failed", "Error", MB_OK);
return 1;
}
printf("Created thread %2d with an ID of %u\n", i, threadId);
}
printf("\nPress ENTER to thaw all threads\n\n");
getchar();
/* Zurückgestellte Threads wieder aufnehmen */
for(i = 0; i < NTHREADS; i++)
ResumeThread(hThreads[i]);
/* Auf die Ausführung der Threads warten */
WaitForMultipleObjects(NTHREADS, hThreads, TRUE, INFINITE);
/* Alle Thread-Handles schließen */
for(i = 0; i < NTHREADS; i++)
CloseHandle(hThreads[i]);
return 0;
}
Portabilität
POSIX | Win32 | ANSI C | ANSI C++ |
---|---|---|---|
+ |