#include <pthread.h> int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);
guardsize 属性をアプリケーションで使用する目的は、次の 2 つです。
オーバーフローを防止すると、システムリソースが無駄になるおそれがあります。アプリケーションが多くのスレッドを生成し、そのスレッドがスタックをオーバーフローしないことが分かっている場合には、ガード領域をオフにできます。ガード領域をオフにすることで、システムリソースを節約できます。
スレッドがスタックに割り当てたデータ構造が大きい場合は、スタックオーバーフローを検出するために、大きなガード領域が必要になることがあります。
guardsize 引数は、スタックポインタのオーバーフローを防ぐためのものです。スレッドのスタックがガードとともに作成された場合、実装はスタックのオーバーフローの終わりに追加のメモリーを割り当てます。この追加メモリーは、スタックポインタのスタックオーバーフローに対するバッファーとして動作します。このバッファーにアプリケーションがオーバーフローすると、スレッドに SIGSEGV シグナルが配信されるなどのエラーが発生します。
guardsize が 0 の場合は、attr を使って作成したスレッドにはガード領域が含まれません。guardsize が 0 よりも大きい場合は、少なくとも guardsize バイトのガード領域が、attr を使って作成した各スレッドに割り当てられます。デフォルトでは、スレッドは実装で定義された 1 バイト以上のガード領域を持ちます。
準拠実装では、guardsize に含まれる値を、設定可能なシステム変数 PAGESIZE の倍数に切り上げることが認められています。sys/mman.h の PAGESIZE を参照してください。実装が guardsize の値を PAGESIZE の倍数に切り上げる場合は、attr を指定して pthread_attr_getguardsize() を呼び出すと、guardsize には前回 pthread_attr_setguardsize() を呼び出したときに指定されたガードサイズが使用されます。