_beginthreadex

提供: RAD Studio
移動先: 案内検索

process.h:インデックス への移動


ヘッダーファイル

process.h

カテゴリ

プロセス制御ルーチン

プロトタイプ

unsigned long _beginthreadex(void *__security_attr, unsigned __stksize, unsigned (__stdcall *__start)(void *), void *__arg, unsigned __create_flags, unsigned *__thread_id);

説明

スレッドを作成します。その際,OS の API CreateThread のほかのパラメータ(セキュリティ,スレッド作成フラグなど)を指定できます。スレッド関数が終了すると,_endthreadex 関数が自動的に呼び出されます。スレッド関数から返された値は,_endthreadex に渡され,さらに _endthreadex から ExitThread API に渡されます。この戻り値は,GetExitCodeThread API を使って取得できます。

_endthread とは異なり,_endthreadex 関数は,スレッドハンドルを閉じません。したがって,ほかのスレッドは,ハンドルがシステムから解放される事態を考慮せずに,このスレッドに対してブロックできます。

パラメータの順序とスレッドハンドルが閉じられないことを除くと,_beginthreadex は _beginthreadNT と同じ操作を実行します。

メモ:  メモ:開始アドレスは,unsigned 型の値(スレッド終了コード)を返すように定義する必要があります。

戻り値

_beginthreadex は,新しいスレッドのハンドルを返します。この戻り値は,オペレーティングシステムの API(SuspendThread,ResumeThread など)で使用できる標準 Windows ハンドルです。

失敗した場合は,0 が返され,errno が次の値に設定されます。

EAGAIN

スレッドが多すぎる

ENOMEM

メモリが不十分

EINVAL

不正なスタック値(16 バイト未満,0 であるなど)



MSDN ライブラリで,Win32 API GetLastError の説明も参照してください。



 //*  この例では,-tWM(32 ビットマルチスレッドターゲット)コマンドラインスイッチを使用します。*/
 #pragma checkoption -tWM
 #include        <windows.h>
 #include        <process.h>
 #include        <stdio.h>
 #define NTHREADS 25
 /* この関数は,新しいスレッドの「main」関数として動作します */
 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), /* 構造体のサイズ */
           0,      /* セキュリティ記述子はなし */
           TRUE    /* スレッドハンドルは継承可能です */
    };
    /* 最初は一時停止状態で作成され,threadMain() で実行を開始する NTHREADS 個の継承可能スレッドを作成します*/
    for(i = 0; i < NTHREADS; i++) {
       hThreads[i] = (HANDLE)_beginthreadex(
          &sa,          /* スレッドのセキュリティ */
          4096,         /* スレッドのスタックサイズ */
          threadMain,   /* スレッドの開始アドレス */
          (void *)i,    /* スレッドの開始引数 */
          CREATE_SUSPENDED,  /* 一時停止状態で作成します */
          &threadId);   /* スレッド 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();
 
 /* 一時停止状態のスレッドを再開します */
    for(i = 0; i < NTHREADS; i++)
       ResumeThread(hThreads[i]);
 
 /* スレッドの実行を待ちます */
    WaitForMultipleObjects(NTHREADS, hThreads, TRUE, INFINITE);
 /* すべてのスレッドハンドルを閉じます */
    for(i = 0; i < NTHREADS; i++)
       CloseHandle(hThreads[i]);
    return 0;
 }



移植性



POSIX Win32 ANSI C ANSI C++

+