PTHREAD_ATTR_SETSTACK(3)

名前
pthread_attr_setstack, pthread_attr_getstack - スレッド属性オブジェクトのスタック属性の設定/取得を行う

書式
#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():
    _POSIX_C_SOURCE >= 200112L

説明
pthread_attr_setstack() 関数は、 attr が参照するスレッド属性オブジェクトのスタックアドレス属性と スタックサイズ属性をそれぞれ stackaddr と stacksize で 指定された値に設定する。 これらの属性により、スレッド属性オブジェクト attr を使って 作成されるスレッドが使用すべきスタックの位置とサイズが指定される。

stackaddr は、呼び出し側で割り当てた、大きさが stacksize バイトの バッファー内の指定できる最小のアドレスバイトを指すべきである。 割り当てられたバッファーのページは読み書き両方が可能なページとなっている べきである。

pthread_attr_getstack() 関数は、 スレッド属性オブジェクト attr のスタックアドレス属性と スタックサイズ属性をそれぞれ stackaddr と stacksize が 指すバッファーに入れて返す。

返り値
成功すると、これらの関数は 0 を返す。 エラーの場合、0 以外のエラー番号を返す。

エラー
pthread_attr_setstack() は以下のエラーで失敗する場合がある。

EINVAL
    stacksize が PTHREAD_STACK_MIN (16384) よりも小さい。 システムによっては、 stackaddr か stackaddr + stacksize のアライメントが適切でない場合にも このエラーが発生する。

POSIX.1 では エラー EACCES も規定されており、このエラーは stackaddr と stacksize で規定されるスタック領域に呼び出し側から読み書き両方のアクセスができない状況を表す。

バージョン
これらの関数は glibc バージョン 2.2 以降で提供されている。

属性
この節で使用されている用語の説明については、 attributes(7) を参照。
インターフェース | 属性 | 値
pthread_attr_setstack(), pthread_attr_getstack() | Thread safety | MT-Safe

準拠
POSIX.1-2001, POSIX.1-2008.

注意
これらの関数は、スレッドのスタックが特定の場所に配置されることを保証 しなければならないアプリケーションのために提供されている。 ほとんどのアプリケーションでは、このようなことは必要なく、 これらの関数を使うのは避けるべきである。 (アプリケーションが単にスタックサイズだけをデフォルトの値から変更する 必要がある場合には pthread_attr_setstacksize(3) を使うこと)

アプリケーションが pthread_attr_setstack() を利用する際には、 スタックの割り当てに責任を持つ必要がある。 pthread_attr_setguardsize(3) を使って設定された guard size の値は無視される。 必要と思われる場合は、アプリケーションが責任を持ってガード領域 (読み書 きが行われないように保護された 1 個かそれ以上のページ) の割り当てを行い、 スタックオーバーフローの可能性に対処するようにする必要がある。

stackaddr に指定するアドレスは適切なアライメントとなっているべきである。 完全な移植性を持たせるためには、 ページ境界 (sysconf(_SC_PAGESIZE)) に揃えること。 割り当てには posix_memalign(3) を使うとよい。 たいていは、 stacksize はシステムのページサイズの倍数とすべきである。

一つの attr を使って複数のスレッドを作成する場合、 pthread_create(3) の次の呼び出しを行う前に、 呼び出し側でスタックアドレス属性を変更しなければならない。 さもなければ、複数のスレッドがスタックとして同じメモリー領域を 使おうとするため、訳の分からない状況が発生してしまう。

例
pthread_attr_init(3) を参照。

関連項目
mmap(2), mprotect(2), posix_memalign(3), pthread_attr_init(3), pthread_attr_setguardsize(3), pthread_attr_setstackaddr(3), pthread_attr_setstacksize(3), pthread_create(3), pthreads(7)

この文書について
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。