深夜開発

プログラミング備忘録

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