Provided by: manpages-ja-dev_0.5.0.0.20180315+dfsg-1_all
名前
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 || _XOPEN_SOURCE >= 600
説明
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-2001 では エラー EACCES も規定されており、 このエラーは stackaddr と stacksize で 規定されるスタック領域に 呼び出し側から読み書き両方のアクセスができない状況を表す。
バージョン
これらの関数は glibc バージョン 2.2 以降で提供されている。
属性
マルチスレッディング (pthreads(7) 参照) 関数 pthread_attr_setstack() と pthread_attr_getstack() はスレッドセーフである。
準拠
POSIX.1-2001.
注意
これらの関数は、スレッドのスタックが特定の場所に配置されることを保証 しなければならないア プリケーションのために提供されている。 ほとんどのアプリケーションでは、このようなことは必 要なく、 これらの関数を使うのは避けるべきである。 (アプリケーションが単にスタックサイズだ けをデフォルトの値から変更する 必要がある場合には 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 プロジェクトのリリース 3.79 の一部 である。プロジェクト の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。