14. joinの注意点
第1回:pthreadについて(概要・生成)にて、pthread_join
とpthread_detach
の関係について述べました。簡単に振り返ると、pthread_join
とはスレッドの終了を待ち、pthread_detach
はスレッドの終了を待たなくてもよいということです。
第5回:pthreadについて(スタックサイズ)で少し触れてますが、スレッドを起動するとそのスレッドはJoinable、つまりpthread_join
で待つべきスレッドとなります。
ではpthread_join
で待つべきスレッドに対して待たなかったらどうなるのか、つまり手を抜いてDetachableにしないで生成していったらどうなるのかを検証します。以下のプログラムは起動時に指定された数値までスレッドを起動します。起動したスレッドは何もせずに終了します。
/* gcc join_thread.c -o join_thread -W -Wall -g -lpthread */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <pthread.h> void * thread_func( void * arg ); int main( int argc, char ** argv ) { pthread_attr_t attr; pthread_t id; size_t size = 0; int status = 0; int i = 0; int max; if( argc < 2 ) { return 1; } pthread_attr_init( &attr ); pthread_attr_getstacksize( &attr, &size ); // pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_JOINABLE ); // pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_DETACHED ); max = atoi( argv[1] ); for( i = 0; i < max; i ++ ) { status = pthread_create( &id, &attr, thread_func, 0 ); if( status ) { printf( "pthread_create error. [%d][%s]\n", status, strerror( status )); break; } } printf( "thread_cnt:[%d] size:[%zdM]\n", i, size >> 20 ); return 0; } void * thread_func( void * arg ) { ( void )arg; return 0; }
一見しただけでは、指定された数値までスレッドの生成が可能と思われます。しかし実行結果は下記のとおり。
guest $ ./join_thread 16384 pthread_create error. [12][Cannot allocate memory] thread_cnt:[303] size:[10M] guest $ guest $ cat /proc/sys/kernel/threads-max 16384 guest $
303個しかスレッドが起動しませんでした。起動可能スレッド数は低く見ても8000(16384/2)はあるのに。これはつまり、スレッドは一見すると終了しているように見えますが、join されていないことでメモリが解放されていないため、メモリ不足でスレッド生成できなくなって異常終了しています。
このように、例え小さな処理しかしない場合でも、pthread_detach
を行わないのであれば、ちゃんとpthread_join
を行いましょう。
15. まとめ
pthreadについての記事は以上になります。
PCやサーバは今までCPU単体の性能向上を行ってきましたが、今後は複数CPUを搭載しての性能向上に向かっていきます。Core 2 Duoとかまさにそうです。
しかしこれは逆に見ると、CPU単体の性能の限界を表していると思われます。
つまりCPU速度に依存した、要は一般的なアプリケーションの場合、複数CPU環境での性能向上は容易に見込まれないでしょう。
なぜなら、1つのアプリケーションは、たとえ他のCPUがスカスカでも、1つのCPUにインプリされる傾向があるからです。
pthreadは主にCPUにインプリされることが多く(OS依存なんですが)、つまりCPUが増えればその分スレッド化による性能向上が見込まれます。
並列処理特有の問題もありますが、今後はフレームワークや上位アプリケーションでも使われる場面が増えそうな技術だと思います。
参考文献とレビュー
下記にあげる本はpthreadについて言及されていますが、全て10年以上前に出版された本です。レビューはあくまで個人的な感想です。
- 『Pthreadsプログラミング』 Brad Nichols・Jacqueline Proulx Farrell・Dick Buttlar 著、榊正憲 訳、オライリー・ジャパン、1998年5月
- 『マルチスレッドプログラミング入門』 Bil Lewis・Daniel J. Berg 著、岩本信一 訳、アスキー、1996年9月
- 『POSIXスレッドプログラミング』 David R.Butenhof 著、油井尊 訳、アスキー、1998年11月