スレッドの関数一覧(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

*1:輪講でつかった書籍は以下。Advanced Programming in the Unix Environment :ISBN 978-0201433074

*2:Cの標準ライブラリを使うスレッドを作成する場合はこちらを使う

*3:_beginthreadexで作成したスレッドの場合、こちらを使う

*4:このapiを使った場合、stack領域等は解放されません。緊急用のapiらしく、使用もあまり推奨されてません

*5:thread specific dataの略

*6:thread local storageの略。Windowsでは、こっちの呼び方をする。

*7:Advanced Windows 6.5.3:ISBN 4-7561-3805-5