2. スレッドの生成と終了(2/2):起動可能なスレッド数
2.4 起動可能なスレッド数
1プロセス内でいくつのスレッドを起動できるのか。スレッドの上限値はproc上で定義されてますが、実際はOSやメモリ資源によっても制限を受けます。
スレッドを生成すると、スレッドに対しスタックが割り当てられます。スレッドを生成すればそれだけメモリを消費するので、際限なくスレッドを起動していけばメモリが足りなくなるなどの理由で起動できなくなります。
以下のサンプルを起動すると、その環境におけるプロセスあたりの最大スレッド数を割り出します。その時の値がその環境の起動可能スレッド数の最大値となります(ただしスタックサイズは初期値)。pthread_mutex_*系関数やpthread_cond_*系関数については別章で説明します。
/* gcc max_thread.c -o max_thread -W -Wall -lpthread */ #include <stdio.h> #include <string.h> #include <pthread.h> #include <unistd.h> void * temp_func( void * arg ); pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond = PTHREAD_COND_INITIALIZER; int main( ) { size_t stack_size = 0; int i = 0; int rtn = 0; pthread_t id; pthread_attr_t attr; pthread_attr_init( &attr ); pthread_attr_getstacksize( &attr, &stack_size ); pthread_mutex_lock( &mutex ); for( i = 0; ; i ++ ) { rtn = pthread_create( &id, 0, temp_func, ( void * )&i ); if( rtn ) { fprintf( stdout, "stacksize:%zd thread_count:%d all_memory:[%zd] " "error:[%d][%s]\n", stack_size, i - 1, stack_size * ( i - 1 ), rtn, strerror( rtn )); break; } pthread_cond_wait( &cond, &mutex ); } pthread_mutex_unlock( &mutex ); fprintf( stdout, "max thread count:[%d]\n", i - 1 ); return 0; } void * temp_func( void * arg ) { pthread_mutex_lock( &mutex ); int cnt = *( int * )arg; pthread_cond_signal( &cond ); pthread_mutex_unlock( &mutex ); if( cnt % 1000 == 0 && cnt != 0 ) { fprintf( stdout, "temp_func:[%4d]\n", cnt ); } while( 1 ) { sleep( 3600 ); } pthread_exit( 0 ); }
以下は私の環境での実行結果です。
guest $ ./max_thread stacksize:10485760 thread_count:303 all_memory:[3177185280]error:[12][Cannot allocate memory] max thread count:[303] guest $
なお、RedHat系Linuxの場合、下記ファイルをcatする事で起動可能なスレッド数の参考になります。
guest $ cat /proc/sys/kernel/threads-max 24572 guest $
このファイルはカーネルおよびドライバが管理するファイルで、threads-maxには、プロセス数とスレッド数の合計が設定されています。起動可能スレッド数は、ほぼ半分の値になるはずです。
もし半分以下の場合(私の環境はまさにそうなんですが)、スタックサイズを小さくする事で起動スレッド数を増やす事が可能です。詳細は別章(スレッド属性)で述べます。
次回は同期の種類と各々の実装法、性能値について述べます。

error:[12][Cannot allocate memory]
max thread count:[303]
guest $