pthreadはデタッチ状態になるまでリソースを解放しない

pthread_create関数で10万回くらいスレッドを作って色々やらせるコードを書いていたら、32745本目でスレッドが作れなくなって困っていた。それだけではなく、そのプログラムは大量のメモリ(2GB以上)を食いつぶしていた。どうやら終了したスレッドが解放されず、OSの上限(?)に達してしまったようだ。

このような事態を避けるには、スレッドをデタッチ状態にする必要がある。

pthread_create関数で作成した属性無しのスレッドは、スレッド関数が終了してもメモリを解放しない。これは同期処理(pthread_join関数)のためにそうなっている(合流可能状態のスレッド)。

joinの必要が無く、スレッド関数が終了したら即座にメモリを解放したい場合は、pthread_create関数の第2引数にpthread_attr_setdetachstate関数でデタッチ属性を与えたpthread_attr_tを与えてデタッチ状態のスレッドを生成するか、pthread_detach関数を使ってスレッドを後からデタッチ状態に変更する必要がある。

これで10万回でも100万回でも作りたい放題*1

*1:もちろん、同時に10万本は無理。やっぱり32745本で止まっちゃう