スレッドの管理

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はプロセス内でユニークである。でもスレッド終了後には再利用される可能性がある。
スレッドの属性
  • スレッドの属性については、OSやライブラリのバージョンの違いによって正しく機能しないことがある。デフォルトの属性(NULL)推奨。
他のスレッドの強制停止
  • pthread_cancelをすると他のスレッドを停止できる
    • でもリソースの解放はされない。メモリリークの温床になる。できるだけ使わない。