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