[[Hirofumi Fujii Start Page]] * Thread の中止 [#nd8ae04c] Thread の外部からの中止するために、 Thread を外部から中止するために、 - POSIX thread の場合は pthread_cancel(pthread_t threadid) - Windows thread の場合は TerminateThread(HANDLE threadhandle, DWORD dwtimeout) という関数が用意されている。 基本的には、この関数呼び出しで中止できるのであるが、 programming 上それほど単純ではない。 特に thread の停止は基本的には system 任せなので、いつ、どの時点で行われるのか 明確ではない(POSIX thread では cancel を受け付ける位置を細かく指定できるようになっている -- ようである。ただし、現在の実装でその通り機能するかどうか疑問がある) 。従って、programming 上では、いつどこで止められても正しく動作する ように備えておかなければならない。 その thread が所有していた system 管理下の資源は(多分)system がきれいに してくれる(べきである)。ところが、一般に thread にするのは、別 thread との 間に共有資源があるからで、 (もし無ければ別 process で動かせばよい)ある thread を中止したときに、 この共有資源がどういう状態になっているかが一番の問題である。 例を考えよう。 - ある thread (thread A とする)が装置からデータを読み出し、共有 buffer に詰めている。 - 別 thread (thread B とする)が詰め終わったデータを処理している。 - thread A が cancel された。 この時共有資源として、少なくとも - buffer - 詰め終わったデータ数 があるだろう。更にこの資源の排他制御と同期のために - mutex - semaphore が使われるのが一般的である。 正常動作時には、thread A は - mutex を lock - buffer にデータを詰める - 詰めたデータ数を設定する - semaphore を increment - mutex を unlock 一方 thread B は - semaphore を待つ - mutex を lock - データを処理 - mutex を unlock - semaphore を decrement