標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
Single UNIX Specification、バージョン 3 |
両方 | z/OS V1R9 |
#define _UNIX03_THREADS
#include <pthread.h>
int pthread_attr_setstack(pthread_attr_t *attr, void *addr, size_t size);
pthread_attr_setstack() 関数は、attr の stackaddr および stacksize 属性を、それぞれ addr および size の値で設定します。
スレッドが作成されると、stackaddr 属性は作成済みスレッドの初期スタック・セグメントの基本 (最小のアドレス可能バイト) を位置指定します。stacksize 属性は、スレッドに割り振る初期スタック・セグメントのバイト単位のサイズです。
attr は、pthread_attr_init() によって初期化された スレッド属性オブジェクトを指すポインターです。
addr は、初期スタック・セグメントを使用するためのメモリーの位置で、スタックとして使用するために適切に調整されていなければなりません。31 ビット・アプリケーションでは、スタック調整は 4k 境界で、AMODE64 では調整はメガバイト境界です。
size は、少なくとも PTHREAD_STACK_MIN と同じ程度の大きさでなければなりません。この定数は、<limits.h> ヘッダーに定義されています。
31 ビットでの最小 stacksize は 4096 (4 K) で、64 ビットでは 1048576 (1M) です。 さらに、システムは等価のサイズの guardpage を割り振ります。指定された最大 stacksize はありません。スレッドの作成時にシステムに必要なストレージ以上のストレージを要求した場合、pthread_create() は失敗して EINVAL を戻します。
正常に実行された場合、pthread_attr_setstack() はゼロを戻します。正常に実行されなかった場合、エラー番号を戻します。
⁄* CELEBP65 *⁄
⁄* Example using SUSv3 pthread_attr_setstack() interface *⁄
#define _UNIX03_THREADS 1
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <limits.h>
#include <errno.h>
int main(void)
{
pthread_attr_t attr;
int rc;
void * stackaddr;
void *mystack;
size_t stacksize;
size_t mystacksize = 2 * PTHREAD_STACK_MIN;
if (pthread_attr_init(&attr) == -1) {
perror("error in pthread_attr_init");
exit(1);
}
⁄* Get a big enough stack and align it on 4K boundary. *⁄
mystack = malloc(PTHREAD_STACK_MIN * 3);
if (mystack != NULL) {
printf("Using PTHREAD_STACK_MIN to align stackaddr %x.¥n", mystack);
mystack = (void *)((((long)mystack + (PTHREAD_STACK_MIN - 1)) ⁄
PTHREAD_STACK_MIN) * PTHREAD_STACK_MIN);
} else {
perror("Unable to acquire storage.");
exit(2);
}
printf("Setting stackaddr to %x¥n", mystack);
printf("Setting stacksize to %x¥n", mystacksize);
rc = pthread_attr_setstack(&attr, mystack, mystacksize);
if (rc != 0) {
printf("pthread_attr_setstack returned: %d¥n", rc);
printf("Error: %d, Errno_Jr: %08x¥n", errno, __errno2());
exit(3);
} else {
printf("Set stackaddr to %x¥n", mystack);
printf("Set stacksize to %x¥n", mystacksize);
}
rc = pthread_attr_getstack(&attr, &stackaddr, &stacksize);
if (rc != 0) {
printf("pthread_attr_getstack returned: %d¥n", rc);
printf("Error: %d, Errno_Jr: %08x¥n", errno, __errno2());
exit(4);
} else {
printf("Retrieved stackaddr is %x¥n", mystack);
printf("Retrieved stacksize is %x¥n", mystacksize);
}
rc = pthread_attr_destroy(&attr);
if (rc != 0) {
perror("error in pthread_attr_destroy");
printf("Returned: %d, Error: %d¥n", rc, errno);
printf("Errno_Jr: %x¥n", __errno2());
exit(5);
}
exit(0);
}