Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

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

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

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2008/01/18 14:00

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:メモリ領域のサイズを格納する領域。

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

著者プロフィール

  • 赤松 エイト(エイト)

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

バックナンバー

連載:pthreadについて

もっと読む

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5