スレッドの作成にはCreateThread APIが用意されていますが、これはマルチスレッドを考慮していないため_beginthread()を利用します。
uintptr_t _beginthread( // NATIVE CODE void( __cdecl *start_address )( void * ), // unsigned stack_size, // void *arglist // );
uintptr_t _beginthreadex( // NATIVE CODE
void *security,
unsigned stack_size,
unsigned ( __stdcall *start_address )( void * ),
void *arglist,
unsigned initflag,
unsigned *thrdaddr
);
_beginthread、_beginthreadex | MSDN
HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // セキュリティ記述子 DWORD dwStackSize, // 初期のスタックサイズ LPTHREAD_START_ROUTINE lpStartAddress, // スレッドの機能 LPVOID lpParameter, // スレッドの引数 DWORD dwCreationFlags, // 作成オプション LPDWORD lpThreadId // スレッド識別子 );CreateThread 関数 | MSDN
_endthread()を呼び出します。
void _endthread( void );
void _endthreadex( unsigned retval );_endthread、_endthreadex | MSDN
クリティカル セクションとは、1つのプロセスに含まれる複数のスレッドが、共有リソースにアクセスするときに排他制御するための仕組みです。
機能 | 関数 | 備考 |
---|---|---|
初期化 | InitializeCriticalSection() | |
所有権獲得 | EnterCriticalSection() | 所有権が獲得されるまで処理が返されない |
TryEnterCriticalSection() | すぐに処理が返される | |
所有権解放 | LeaveCriticalSection() | |
削除 | DeleteCriticalSection() |
これは次のように利用できます。
CRITICAL_SECTION c; void Func() { EnterCriticalSection(&c); // 危険な処理 LeaveCriticalSection(&c); } void Main() { InitializeCriticalSection(&c); // 別スレッドからFunc()を呼ぶ DeleteCriticalSection(&c); }
void InitializeCriticalSection( LPCRITICAL_SECTION lpCriticalSection );InitializeCriticalSection function (synchapi.h) | Microsoft Learn
型 | 用途 | 説明 |
---|---|---|
イベント (Event) | 他のスレッドへ通知 | Notifies one or more waiting threads that an event has occurred. |
ミューテックス (Mutex) | リソースの排他制御 | Can be owned by only one thread at a time, enabling threads to coordinate mutually exclusive access to a shared resource. |
セマフォ (Semaphore) | リソースの同時使用数制限 (指定数の排他制御) など | Maintains a count between zero and some maximum value, limiting the number of threads that are simultaneously accessing a shared resource. |
待機可能タイマー (Waitable timer) | タイマーイベントの通知 | Notifies one or more waiting threads that a specified time has arrived. |
HANDLE CreateMutexA( LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCSTR lpName );CreateMutexA function (synchapi.h) | Microsoft Learn
指定のオブジェクトがシグナル状態になるか、タイムアウトするまで待機させられます。
DWORD WaitForSingleObject( [in] HANDLE hHandle, // オブジェクトへのハンドル [in] DWORD dwMilliseconds // タイムアウトの間隔。ミリ秒単位 );WaitForSingleObject function (synchapi.h) - Win32 apps | Microsoft Learn
hHandleはCreateEvent()で作成でき、それに他のスレッドからSetEvent()でシグナル状態にすることで、このメソッドに状態を伝えられます。
戻り値 | |
---|---|
WAIT_OBJECT_0 | 指定のオブジェクトは、シグナル状態 |
WAIT_TIMEOUT | タイムアウトの時間が経過し、オブジェクトは非シグナル状態 |
複数のオブジェクトを対象とするならば、WaitForMultipleObjects()を用います。
HANDLE CreateEventA( [in, optional] LPSECURITY_ATTRIBUTES lpEventAttributes, [in] BOOL bManualReset, [in] BOOL bInitialState, [in, optional] LPCSTR lpName );CreateEventA function (synchapi.h) - Win32 apps | Microsoft Learn
BOOL SetEvent( [in] HANDLE hEvent );SetEvent function (synchapi.h) - Win32 apps | Microsoft Learn
ミューテックスとの違いは、ミューテックスでは1つだけの所有権が、セマフォでは複数あることです。