Linuxとpthreadsによるマルチスレッドプログラミング入門を読んでいる。
この記事は第二章のメモ。
スレッドを作る
本に書いてあったことはだいたい知ってたので、man pthread_create
したときのメモを載せてみる。
- threadは以下のいずれかの終わり方をする
- スレッド内で
pthread_exit()を
呼ぶ。このときexit statusを指定できる。 pthread_create
したときの指定関数の返り値で終わる。これはpthread_exit
と同じ。pthread_cancel
される- どれからのスレッドで
exit
が呼ばれる
- スレッド内で
- デフォルトのスタックサイズは2MB
- Linux 2.4からはgetpidするとTGID(thread group identifier)が取得できる。同じプロセス内でスレッドを立ち上げた場合にはTGIDは同じ値なため、同じものが得られる。
- 実際確かめてみたら同じになった。
スレッドの終了
- pthreadではスレッド間に優劣や親子関係があるのではなく、プロセス内のすべてのスレッドが原則として対等である
スレッドIDとスレッド終了待ち
man pthread_join
を読む。
int pthread_join(pthread_t thread, void **retval);
はthreadで指定されたスレッドの終了を待つ。もし既に終わっていたら、すぐpthread_join()は帰ってくる。- retvalがNULLでない場合、pthread_join()はスレッドのexit statusをコピーして、
*retval
で指定される場所に格納する。 - 複数スレッドが同時にjoinしようとしたときの挙動は不定
- 一回joinしたあともう一度joinするときの挙動も不定
- なのでjoinしたらthreadにNULLを入れておき、joinの事前にチェックしておくなど対策要。
- joinableなスレッドをjoin失敗した時はゾンビスレッドが生まれてしまう。
スレッドの同定
- pthreadではpthread_self()を使ってスレッドIDを取得できる。
- LinuxではスレッドIDは単純な数値になっている。しかし、OSやCPUの都合によりpthread_t型は単純な数値型にならないことがありえる。pthread_t型の比較にはpthread_equalを使うことを推奨。
POSIX.1 allows an implementation wide freedom in choosing the type used to represent a thread ID; for example, representation using either an arithmetic type or a structure is permitted. Therefore, variables of type pthread_t can't portably be compared using the C equality operator (==); use pthread_equal(3) instead.
- スレッドIDはプロセス内でユニークである。でもスレッド終了後には再利用される可能性がある。
- LinuxではスレッドIDは単純な数値になっている。しかし、OSやCPUの都合によりpthread_t型は単純な数値型にならないことがありえる。pthread_t型の比較にはpthread_equalを使うことを推奨。
スレッドの属性
- スレッドの属性については、OSやライブラリのバージョンの違いによって正しく機能しないことがある。デフォルトの属性(NULL)推奨。
他のスレッドの強制停止
- pthread_cancelをすると他のスレッドを停止できる
- でもリソースの解放はされない。メモリリークの温床になる。できるだけ使わない。