_beginthread
Nach oben zu Process.h - Index
Header-Datei
process.h
Kategorie
Prozesssteuerungsroutinen
Prototyp
unsigned long _beginthread(void (_USERENTRY *__start)(void *), unsigned __stksize, void *__arg);
Beschreibung
Startet die Ausführung eines neuen Threads.
Anmerkung: Der Parameter start_address muss als _USERENTRY deklariert werden.
Die Funktion _beginthread erstellt und startet einen neuen Thread. Der Thread beginnt die Ausführung bei start_address.
Die Größe seines Stacks in Bytes ist stack_size. Der Stack wird vom Betriebssystem zugewiesen, nachdem die Stack-Größe auf das nächste Mehrfache von 4096 aufgerundet wurde. Dem Thread wird nur der Parameter arglist übergeben. Er kann NULL sein, muss aber angegeben werden. Die Thread-Funktion sollte enden, indem sie einfach zurückkehrt. Die Funktion _endthread wird automatisch aufgerufen. Die Funktion _endthread schließt automatisch das Handle und setzt den Rückgabewert des Threads auf Null.
Es muss statt der Thread-erstellenden API-Funktion des Betriebssystems entweder diese Funktion oder _beginthreadNT verwendet werden, weil _beginthread und _beginthreadNT die Intitialisierung durchführen, die für die korrekte Arbeitsweise der Laufzeit-Bibliotheksfunktionen erforderlich ist.
Diese Funktion ist nur in den Multithread-Bibliotheken verfügbar.
Rückgabewert
_beginthread 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..
Bei einem Fehler gibt die Funktion -1 zurück, und die globale Variable errno wird auf einen der folgenden Werte gesetzt:
EAGAIN |
Too many threads (Zu viele Threads) |
EINVAL |
Invalid stack size (Ungültige Stack-Größe, also weniger als 16 Byte oder Null) |
ENOMEM |
Not enough memory (Unzureichend Speicher) |
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) */
#include <stdio.h>
#include <errno.h>
#include <stddef.h> /* _threadid-Variable */
#include <process.h> /* _beginthread, _endthread */
#include <time.h> /* time, _ctime */
void thread_code(void *threadno)
{
time_t t;
time(&t);
printf("Executing thread number %d, ID = %d, time = %s\n",
(int)threadno, _threadid, ctime(&t));
}
void start_thread(int i)
{
int thread_id;
#if defined(__WIN32__)
if ((thread_id = _beginthread(thread_code,4096,(void *)i)) == (unsigned long)-1)
#else
if ((thread_id = _beginthread(thread_code,4096,(void *)i)) == -1)
#endif
{
printf("Unable to create thread %d, errno = %d\n",i,errno);
return;
}
printf("Created thread %d, ID = %ld\n",i,thread_id);
}
int main(void)
{
int i;
for (i = 1; i < 20; i++)
start_thread(i);
printf("Hit ENTER to exit main thread.\n");
getchar();
return 0;
}
Portabilität
POSIX | Win32 | ANSI C | ANSI C++ |
---|---|---|---|
+ |