スレッドについてもう少し


こないだの続き
各スレッドについてもうちょっと調べたので、追記
またもやWIN32のみのお話です

_beginthread(ex)の戻り値の型は、__w64 unsigned int

_beginthreadexに渡すメソッドの型は unsigned int WINAPI ( void * )

スレッドの停止を感知する方法

  • 普通は、WaitForSingleObject
  • _beginthreadで既に終わっているスレッドに、WaitForSingleObjectをすると、-1L(0xffffffff)が返る
    • _beginthreadは勝手にハンドルを閉じるので

内部でスレッドを停止させる方法

  • スレッドで動かしたメソッドをretrunする
  • _endthread(ex)はスレッド終了時に自動的に呼ばれるので、明示的に呼び出す必要は無い

_beginthreadを外部から停止させる方法

  • 何かしらフラグを用意しておいて、スレッドで頻繁に監視して、フラグがたったら終了とかが一般的?
  • TerminateThreadだと、後片付けをしないので、メモリリークやらの危険がある
  • 個人的には、メンバ変数にクラスを持たせて、スレッドの引数にthisを渡して監視って方法をとってます
    • これだと、グローバル変数じゃないので、後から複数スレッドが必要になってもそんなに面倒でない

その他

  • _beginthreadexはハンドルを自動的に閉じないので、CloseHandleしてやる必要あり
  • スレッド呼び出し元のクラスが終了する時、ちゃんと作成したスレッドも片付けないとメモリリークの危険あり
    • デストラクタで、上記の方法で停止させて、WaitForSingleObjectで終わっているのを確認してから、終了すべき


そんな感じ。