Win32 threadを使ったスレッド生成
Win32API
Microsoft Windows上で用いられるAPIで、スレッドに限らずあらゆる機能を提供する。 通常スレッドを生成するにはCreateThread関数を使用するが、諸事情で同じ機能を提供する_beginThread関数、AfxBeginThread関数なども存在する
Sample code
#include <stdio.h> #include <windows.h> #define STACK_SIZE (512 * 1024) struct thread_args { int r; int a; int b; int c; } // 生成したスレッドで実行する関数 UINT thread_entry(void *args) { auto targs = reinterpret_cast<thread_args*>(args); targs->r = targs->a * targs->b + targs->c; return 0; } int main() { thread_arg args; args.r = 0; args.a = 10; args.b = 20; args.c = 30; UINT thread_id = 0; auto thread_handle = reinterpret_cast<HANDLE>(_beginthreadex( nullptr, // セキュリティ属性 static_cast<unsigned int>(STACK_SIZE), // スタックサイズ thread_entry, // スレッドの実行を開始する関数 &args, // スレッド関数に渡される引数 CREATE_SUSPENDED, // 初期化フラグ。『CREATE_SUSPENDED』を指定すると一時停止状態で生成される &thread_id // スレッド識別子 )); // スレッド優先度を設定 // 『THREAD_PRIORITY_ABOVE_NORMAL』は通常より1ポイント上の優先順位 SetThreadPriority(thread_handle, THREAD_PRIORITY_ABOVE_NORMAL); // スレッドの実行を開始する ResumeThread(thread_handle); // スレッドの終了を待つ WaitForSingleObject(thread_handle, INFINITE); // スレッドハンドルを閉じる CloseHandle(thread_handle); // 結果を出力 printf("value = %d\n", args.r); return 0; }
出力
value = 230