#include <pthread.h> int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize); int pthread_attr_getstack(const pthread_attr_t *attr, void **stackaddr, size_t *stacksize); -pthread でコンパイルしてリンクする。
glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
pthread_attr_getstack(), pthread_attr_setstack():
stackaddr は、呼び出し側で割り当てた、大きさが stacksize バイトの バッファー内の指定できる最小のアドレスバイトを指すべきである。 割り当てられたバッファーのページは読み書き両方が可能なページとなっている べきである。
pthread_attr_getstack() 関数は、 スレッド属性オブジェクト attr のスタックアドレス属性と スタックサイズ属性をそれぞれ stackaddr と stacksize が 指すバッファーに入れて返す。
POSIX.1 では エラー EACCES も規定されており、このエラーは stackaddr と stacksize で規定されるスタック領域に呼び出し側から読み書き両方のアクセスができない状況を表す。
インターフェース | 属性 | 値 |
pthread_attr_setstack(), pthread_attr_getstack() | Thread safety | MT-Safe |
アプリケーションが pthread_attr_setstack() を利用する際には、 スタックの割り当てに責任を持つ必要がある。 pthread_attr_setguardsize(3) を使って設定された guard size の値は無視される。 必要と思われる場合は、アプリケーションが責任を持ってガード領域 (読み書 きが行われないように保護された 1 個かそれ以上のページ) の割り当てを行い、 スタックオーバーフローの可能性に対処するようにする必要がある。
stackaddr に指定するアドレスは適切なアライメントとなっているべきである。 完全な移植性を持たせるためには、 ページ境界 (sysconf(_SC_PAGESIZE)) に揃えること。 割り当てには posix_memalign(3) を使うとよい。 たいていは、 stacksize はシステムのページサイズの倍数とすべきである。
一つの attr を使って複数のスレッドを作成する場合、 pthread_create(3) の次の呼び出しを行う前に、 呼び出し側でスタックアドレス属性を変更しなければならない。 さもなければ、複数のスレッドがスタックとして同じメモリー領域を 使おうとするため、訳の分からない状況が発生してしまう。
[man1]
[man2]
[man3]
[man4]
[man5]
[man6]
[man7]
[man8]
[a]
[b]
[c]
[d]
[e]
[f]
[g]
[h]
[i]
[j]
[k]
[l]
[m]
[n]
[o]
[p]
[q]
[r]
[s]
[t]
[u]
[v]
[w]
[x]
[y]
[z]