SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

pthreadについて

pthreadについて(概要・生成)

pthreadの概要、プロセスとの違い、生成方法


2. スレッドの生成と終了(2/2):起動可能なスレッド数

2.4 起動可能なスレッド数

 1プロセス内でいくつのスレッドを起動できるのか。スレッドの上限値はproc上で定義されてますが、実際はOSやメモリ資源によっても制限を受けます。

 スレッドを生成すると、スレッドに対しスタックが割り当てられます。スレッドを生成すればそれだけメモリを消費するので、際限なくスレッドを起動していけばメモリが足りなくなるなどの理由で起動できなくなります。

 以下のサンプルを起動すると、その環境におけるプロセスあたりの最大スレッド数を割り出します。その時の値がその環境の起動可能スレッド数の最大値となります(ただしスタックサイズは初期値)。pthread_mutex_*系関数やpthread_cond_*系関数については別章で説明します。

max_thread.c
/* 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には、プロセス数とスレッド数の合計が設定されています。起動可能スレッド数は、ほぼ半分の値になるはずです。

 もし半分以下の場合(私の環境はまさにそうなんですが)、スタックサイズを小さくする事で起動スレッド数を増やす事が可能です。詳細は別章(スレッド属性)で述べます。

 次回は同期の種類と各々の実装法、性能値について述べます。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
pthreadについて連載記事一覧

もっと読む

この記事の著者

赤松 エイト(エイト)

(株)DTSに勤てます。WebアプリやJavaやLL等の上位アプリ環境を密かに憧れつつも、ず~っとLinuxとかHP-UXばかり、ここ数年はカーネル以上アプリ未満のあたりを行ったり来たりしています。mixiもやってまして、こちらは子育てとか日々の日記メインです。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1892 2008/08/20 15:58

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー