_beginthread

Aus RAD Studio
Wechseln zu: Navigation, Suche

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++

+