スレッド (thread)

スレッド
順次処理される一連のプログラム。プログラムの最小の実行単位

スレッドの作成

スレッドの作成には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

CreateThread

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

複数スレッドの同期

クリティカル セクション (Critical Section)

クリティカル セクションとは、1つのプロセスに含まれる複数のスレッドが、共有リソースにアクセスするときに排他制御するための仕組みです。

機能 関数 備考
初期化 InitializeCriticalSection  
所有権獲得 EnterCriticalSection 所有権が獲得されるまで処理が返されない
TryEnterCriticalSection すぐに処理が返される
所有権解放 LeaveCriticalSection  
削除 DeleteCriticalSection  

これは次のように利用できます。

CRITICAL_SECTION c;

void Func()
{
    EnterCriticalSection(&c);

    // 危険な処理

    LeaveCriticalSection(&c);
}

void Main()
{
    InitializeCriticalSection(&c);

    // 別スレッドからFunc()を呼ぶ

    DeleteCriticalSection(&c);
}

InitializeCriticalSection

void InitializeCriticalSection(
  LPCRITICAL_SECTION lpCriticalSection
);
InitializeCriticalSection function (synchapi.h) | Microsoft Docs

同期オブジェクト (Synchronization Objects)

用途 説明
イベント (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.
Synchronization Objects - Windows applications | Microsoft Docs

ミューテックス (Mutex)

HANDLE CreateMutexA(
  LPSECURITY_ATTRIBUTES lpMutexAttributes,
  BOOL                  bInitialOwner,
  LPCSTR                lpName
);
CreateMutexA function (synchapi.h) | Microsoft Docs

セマフォ (Semaphore)

ミューテックスとの違いは、ミューテックスでは1つだけの所有権が、セマフォでは複数あることです。

参考

参考書

MSDN (Microsoft Developer Network) から検索