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

スタックガードの大きさの設定

pthread_attr_setguardsize(3THR)

pthread_attr_setguardsize(3THR) は、attr オブジェクトの guardsize (ガードサイズ) を設定します。

guardsize 引数は、スタックポインタのオーバーフローを防ぐためのものです。ガードとともにスレッドのスタックが作成されると、実装は、スタックのオーバーフローの終わりに、スタックポインタのスタックオーバーフローの緩衝域として、余分のメモリーを割り当てます。このバッファにアプリケーションがオーバーフローすると、スレッドに SIGSEGV シグナルが配信されるなどのエラーが発生します。

ガードサイズ属性をアプリケーションで使用する目的は、次の 2 つです。

  1. オーバーフローを防止すると、システムリソースが無駄になるおそれがあります。多くのスレッドが作成されるアプリケーションは、そのスレッドがスタックをオーバーフローしないことがわかっている場合には、ガード領域をオフにすることで、システムリソースを節約できます。

  2. スレッドがスタックに割り当てたデータ構造が大きい場合は、スタックオーバーフローを検出するために、大きなガード領域が必要になることがあります。

guardsize が 0 の場合は、attr を使って作成したスレッドにはガード領域が含まれません。guardsize が 0 よりも大きい場合は、少なくとも guardsize バイトのガード領域が、attr を使って作成した各スレッドに割り当てられます。デフォルトでは、スレッドは実装で定義された 1 バイト以上のガード領域を持ちます。

POSIX では、guardsize の値を、設定可能なシステム変数 PAGESIZE (sys/mman.h の「PAGESIZE」を参照) の倍数に切り上げるように、実装が認められています。実装が guardsize の値を PAGESIZE の倍数に切り上げる場合は、attr を指定して pthread_attr_getguardsize() を呼び出すと、guardsize には前回 pthread_attr_setguardsize() を呼び出したときに指定されたガードサイズが格納されます。


#include <pthread.h>

int pthread_attr_setguardsize(pthread_attr_t *attr, size_t  guardsize);

戻り値

以下の戻り値は、pthread_attr_setguardsize() が失敗したことを示します。


EINVAL

引数 attr が無効であるか、引数 guardsize が無効であるか、あるいは guardsize に無効な値が含まれています。