SHOEISHA iD

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

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

pthreadについて

pthreadについて(シグナル・バリア等)

スレッドによるシグナルの利用法、バリア、それ以外の話題等


  • X ポスト
  • このエントリーをはてなブックマークに追加

14. joinの注意点

 第1回:pthreadについて(概要・生成)にて、pthread_joinpthread_detachの関係について述べました。簡単に振り返ると、pthread_joinとはスレッドの終了を待ち、pthread_detachはスレッドの終了を待たなくてもよいということです。

 第5回:pthreadについて(スタックサイズ)で少し触れてますが、スレッドを起動するとそのスレッドはJoinable、つまりpthread_joinで待つべきスレッドとなります。

 ではpthread_joinで待つべきスレッドに対して待たなかったらどうなるのか、つまり手を抜いてDetachableにしないで生成していったらどうなるのかを検証します。以下のプログラムは起動時に指定された数値までスレッドを起動します。起動したスレッドは何もせずに終了します。

join_thread.c
/* 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月
  • 文章は一番判り辛いです。翻訳を機械で行っただけですね。ただしサンプルはとても良質。

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
pthreadについて連載記事一覧

もっと読む

この記事の著者

赤松 エイト(エイト)

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

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

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1973 2008/08/20 16:01

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング