_beginthread
process.h:インデックス への移動
ヘッダーファイル
process.h
カテゴリ
プロセス制御ルーチン
プロトタイプ
unsigned long _beginthread(void (_USERENTRY *__start)(void *), unsigned __stksize, void *__arg);
説明
新しいスレッドの実行を開始します。
メモ: start_address は,_USERENTRY として宣言される必要があります。
_beginthread 関数は,新しいスレッドを作成して開始します。スレッドは,start_address の位置で実行を開始します。
スタックサイズ(バイト単位)は stack_size です。スタックは,このスタックサイズが 4096 の倍数まで切り上げられた後で,オペレーティングシステムによって割り当てられます。スレッドには,唯一のパラメータとして arglist が渡されます。arglist は NULL でもかまいませんが,指定する必要があります。スレッド関数は,単に戻るだけで終了する必要があります。_endthread 関数は自動的に呼び出されます。_endthread 関数は,自動的にハンドルを閉じ,スレッドの戻り値を 0 に設定します。
オペレーティングシステムのスレッド作成 API 関数のかわりに,_beginthread または _beginthreadNT を使用する必要があります。これは,これらの関数がランタイムライブラリ関数の正しい動作に必要な初期化を実行するからです。
この関数は,マルチスレッドライブラリでのみ使用できます。
戻り値
_beginthread は,新しいスレッドのハンドルを返します。この戻り値は,オペレーティングシステムの API(SuspendThread,ResumeThread など)で使用できる標準 Windows ハンドルです。
エラーが発生した場合は -1 を返し,グローバル変数 errno に次のいずれかの値が設定されます。
EAGAIN |
スレッドが多すぎる |
EINVAL |
スタックサイズが無効(16 バイト未満,0 であるなど) |
ENOMEM |
メモリが不十分 |
MSDN ライブラリで,Win32 API GetLastError の説明も参照してください。
例
/* この例では,-tWM(32 ビットマルチスレッドターゲット)コマンドラインスイッチを使用します。*/
#include <stdio.h>
#include <errno.h>
#include <stddef.h> /* _threadid 変数 */
#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;
}
移植性
POSIX | Win32 | ANSI C | ANSI C++ |
---|---|---|---|
+ |