SHOEISHA iD

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

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

pthreadについて

pthreadについて(スタックサイズ)

スタックサイズの変更と、起動スレッド数の関係


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

pthreadはPOSIX仕様に基づくOSにおける非同期処理の仕組みです。他の非同期処理と比較すると新しい仕組みですが、その奥は深くさまざまな機能を持っています。本稿ではスレッドのスタックサイズ調整方法を解説します。

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

はじめに

 この連載ではUNIX系OSなどで使われるスレッド「pthread」についてサンプルを交えて説明していきます。pthreadはPOSIXが仕様化したスレッドモデルです。サンプルはCと一部C++、調査環境はFedora 8(2.6.23.1-49.fc8)、32bit、glibc-4.1-2、gcc-4.1.2-33およびFedora Core 6(2.6.18-1.2798.fc6)、32bit、glibc-2.5-3、gcc-4.1.1-30を使用しています。

過去の記事

8. スレッド属性(リファレンス)

 スレッドはスレッドを生成する際に属性を付加することができます。属性とはスレッドにおける拡張パラメータのことで、主に下記の区分けがあります。

8.1 種類

1. Detachable or Joinable

 この属性は読んだまま、スレッドをDetachするかJoinするかを予め指定するものです。スレッド生成の際の初期値はJoinableです。

 Attributeとしてわざわざ使用しなくとも、その後にpthread_detachなどを使用することで代替可能ですので、当レポートでは説明を省きます。

2. Thread Scheduling Attributes

 いわゆるスケジューリング処理で必要になる属性です。スケジューリングはスーパーユーザー権限で実行しないと動かない機能です。やや複雑で、使い方次第ではデッドロックを誘発します。

 詳細については9章で説明します。

3. Specifying Stack Information

 スレッドが使用するスタックに対する指定を行うものです。当章ではスタックについて述べていきます。

8.2 リファレンス

 主にスレッド属性の設定にかかわる関数は下記の通りです。より詳細についてはmanコマンド、もしくはココを参照してください。

  • int pthread_attr_init( pthread_attr_t * attr );
    • pthread_attr_init:スレッド属性オブジェクトの初期化
    • pthread_attr_t:スレッド属性オブジェクト。当変数に各種属性を設定し、最終的にpthread_createの第2引数に設定します。
  • int pthread_attr_destroy( pthread_attr_t * attr );
    • pthread_attr_destroy:スレッド属性オブジェクトの破棄
  • int pthread_attr_getstacksize( const pthread_attr_t * attr, size_t *stacksize );
    • pthread_attr_getstacksize:スタックのサイズの取得
    • stacksize:スタックサイズを格納する領域。
  • int pthread_attr_setstacksize( const pthread_attr_t * attr, size_t *stacksize );
    • pthread_attr_setstacksize:スタックのサイズを設定。スタックサイズの最小値はPTHREAD_STACK_MINによって定義されています。
  • int pthread_attr_getguardsize( const pthread_attr_t * attr, size_t * guardsize);
    • pthread_attr_getguardsize:スタックの保護領域のサイズを取得します。メモリ使用上限を超えて使用された事を検知するための領域のことで、この領域に達するとSEGVシグナルが発生します。初期値は1ページ(4096バイト)ですが、スタック上で1ページを越えるような巨大な配列や構造体を積む場合、サイズを増やした方が良いです。
  • int pthread_attr_setguardsize( const pthread_attr_t * attr, size_t guardsize);
    • pthread_attr_setguardsize:スタックの保護領域のサイズを指定します。
  • int pthread_attr_setstack(pthread_attr_t *attr, void * stackaddr, size_t stacksize);
    • pthread_attr_setstack:生成するスレッドに指定したメモリをスタックとして使用させます。
    • stackaddr:ヒープなどからアロケートされた、スタックとして使用するメモリ。
  • int pthread_attr_getstack( const pthread_attr_t * attr, void ** stackaddr, size_t * stacksize );
    • pthread_attr_getstack:生成されたスレッドに指定したメモリおよびメモリサイズを取得する。
    • stackaddr:スレッドが使用しているスタックのアドレスを取得するための領域。
    • stacksize:メモリ領域のサイズを格納する領域。

会員登録無料すると、続きをお読みいただけます

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

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

メールバックナンバー

次のページ
8. スレッド属性(サンプル)

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

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

もっと読む

この記事の著者

赤松 エイト(エイト)

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

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング