スレッドの関数一覧(pthread, win32スレッド)
輪講でpthreadについて、ゼミ担当の人の話を聞きました*1。せっかくなので、windowsのスレッド用 apiと大体対応する関数を並べてみます。
なお、個々のスレッドをあらわすデータ構造の型は、pthreadではpthread_t, windowsスレッドではHANDLEです。各関数の機能詳細は、ググれば色んなサイトが出てくるのでそちらを見てください。
機能 | pthread関数名 | win32 スレッドapi名 |
スレッドの作成 | pthread_create | CreateThread, _beginthreadex*2 |
自スレッドの終了 | pthread_exit | ExitThread, _endthreadex*3 |
他スレッドを終了 | pthread_cancel | TerminateThread*4 |
スレッド終了時に自動的にスレッド作成時に確保したデータ(stack領域等)を解放するように指示 | pthread_detach | デフォルトでこの設定 |
他スレッドの終了を待つ | pthread_join | WaitForSingleObject, WaitForMultipleObjects |
使い終わったスレッドid(handle)を解放する | 解放する必要なし | CloseHandle |
現在実行中のスレッドのid(handle)を返す | pthread_self | GetCurrentThread |
mutexの作成 | pthread_mutex_init | CreateMutex |
mutexのロックを取る | pthread_mutex_lock | WaitForSingleObject |
mutexのロックを解除する | pthread_mutex_unlock | ReleaseMutex |
mutexの破棄 | pthread_mutex_destroy | CloseHandle |
スレッド固有の大域変数(TSD*5 or TLS*6 )を指す領域を確保 | pthread_key_create | TlsAlloc |
TSD(TLS)を指す領域を解放 | pthread_key_delete | TlsFree |
TSD(TLS)のアドレスを得る | pthread_getspecific | TlsGetValue |
TSD(TLS)のアドレスをセット | pthread_setspecific | TlsSetValue |
注意点
pthread_cancelで終了を要求されたスレッドは、その要求に抵抗することができます(pthread_setcancelstate関数でPTHREAD_CANCEL_DISABLEをセットする)。また、終了要求が実際に処理されるのは、要求を出されたスレッドでcancellation point(pause、waitシステムコールなど)を通過したときだけです。
これに対して、TerminateThreadで終了要求をだされたスレッドは、その要求に抵抗することができず、終了するタイミングもシステム依存になります。
また、pthread_cancelで終了したスレッドに対してpthread_joinしたり、あらかじめpthread_detachしていれば、終了したスレッド用のstack領域等が適切に解放されるのにたいして、TerminateThreadはstack領域が解放されません。Windowsがこのような実装になっているのは、実行中の他のスレッドがTerminateThreadで終了させられたスレッドのスタックを参照したときにメモリアクセス違反が起きるのを避けるためです*7。
追記
pthread_cancelを呼んだ後、呼ばれたスレッドを非同期に終了させる(cancellation pointを使わない)ようにすることもできます(pthread_setcanceltype関数)。ただ、この方法はTerminateThread同様に、あまり使うべきやりかたではないそうです。以下のブログで細かく説明されています。
http://d.hatena.ne.jp/yupo5656/20040724/p1