pthread_attr_setguardsize(3T) は、attr オブジェクトの guardsize (ガードサイズ) を設定します。
guardsize 引数は、スタックポインタのオーバーフローを防ぐためのものです。ガードとともにスレッドのスタックが作成されると、実装は、スタックのオーバーフローの終わりに、スタックポインタのスタックオーバーフローの緩衝域として、余分のメモリーを割り当てます。このバッファにアプリケーションがオーバーフローすると、スレッドに SIGSEGV シグナルが配信されるなどのエラーが発生します。
ガードサイズ属性をアプリケーションで使用する目的は、次の 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 に無効な値が含まれています。