マルチスレッドのプログラミング

独自のスタックを構築する

スレッドスタックの大きさを指定するときは、呼び出される関数に必要な割り当てを計算してください。これには、呼び出し手続きで必要とされる量、局所変数、情報構造体が含まれます。

デフォルトスタックと少し違うスタックが必要になることがあります。たとえば、スレッドで 1M バイトを超えるスタック空間が必要になる場合です。また、少し分かりにくいケースですが、デフォルトスタックが大きすぎる場合もあります。何千ものスレッドを生成するとすれば、デフォルトスタックでは合計サイズが数 G バイトにもなるため、仮想メモリが足りず、それだけのスタック空間を扱えないかもしれないからです。

スタックの大きさの上限は明らかであることが多いのですが、下限はどうでしょうか。スタックにプッシュされるスタックフレームを、その局所変数などを含めて、すべて扱えるだけのスタック空間が必要です。

マクロ PTHREAD_STACK_MIN を呼び出すと、スタックの大きさの絶対最小値が得られます。このマクロは、NULL 手続きを実行するスレッドに必要なスタック空間の大きさを戻します。実用的なスレッドに必要なスタック空間はもっと大きいので、スタックサイズを小さくするときは十分注意してください。


#include <pthread.h>

pthread_attr_t tattr;
pthread_t tid;
int ret;

int size = PTHREAD_STACK_MIN + 0x4000;

/* デフォルト属性で初期化する */
ret = pthread_attr_init(&tattr);

/* スタックの大きさも設定する */
ret = pthread_attr_setstacksize(&tattr, size);

/* tattr に大きさのみを指定する */
ret = pthread_create(&tid, &tattr, start_routine, arg); 

独自のスタックを割り当てるときは、その終わりにレッドゾーンを付加するために必ず mprotect(2) を呼び出してください。