_beginthreadex

Aus RAD Studio
Wechseln zu: Navigation, Suche

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

+