はじめに
この連載では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を使用しています。
過去の記事
- 第1回:pthreadについて(概要・生成)
- 第2回:pthreadについて(同期)
- 第3回:pthreadについて(条件変数・モデル)
- 第4回:pthreadについて(スレッド固有データ)
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
:メモリ領域のサイズを格納する領域。