ものぐさ備忘録

2007-07-03 スレッドの関数一覧(pthread, win32スレッド)

[]スレッド関数一覧(pthread, win32スレッド) 21:25

輪講でpthreadについて、ゼミ担当の人の話を聞きました*1。せっかくなので、windowsスレッドapiと大体対応する関数を並べてみます。

なお、個々のスレッドをあらわすデータ構造の型は、pthreadではpthread_t, windowsスレッドではHANDLEです。各関数の機能詳細は、ググれば色んなサイトが出てくるのでそちらを見てください。

機能pthread関数win32 スレッドapi
スレッドの作成pthread_create CreateThread, _beginthreadex*2
スレッドの終了pthread_exitExitThread, _endthreadex*3
スレッドを終了pthread_cancelTerminateThread*4
スレッド終了時に自動的にスレッド作成時に確保したデータ(stack領域等)を解放するように指示pthread_detachデフォルトでこの設定
スレッドの終了を待つpthread_joinWaitForSingleObject, WaitForMultipleObjects
使い終わったスレッドid(handle)を解放する解放する必要なしCloseHandle
現在実行中のスレッドのid(handle)を返すpthread_selfGetCurrentThread
mutexの作成pthread_mutex_initCreateMutex
mutexのロックを取るpthread_mutex_lockWaitForSingleObject
mutexのロックを解除するpthread_mutex_unlockReleaseMutex
mutexの破棄pthread_mutex_destroyCloseHandle
スレッド固有の大域変数(TSD*5 or TLS*6 )を指す領域を確保pthread_key_createTlsAlloc
TSD(TLS)を指す領域を解放pthread_key_deleteTlsFree
TSD(TLS)のアドレスを得るpthread_getspecificTlsGetValue
TSD(TLS)のアドレスをセットpthread_setspecificTlsSetValue

注意点

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