pthread_attr_setstack() - スタック属性の設定

標準

標準/拡張機能 C/C++ 依存項目

Single UNIX Specification、バージョン 3

両方

z/OS V1R9
POSIX(ON)

形式

#define _UNIX03_THREADS
#include <pthread.h>

int pthread_attr_setstack(pthread_attr_t *attr, void *addr, size_t size);

機能説明

pthread_attr_setstack() 関数は、attrstackaddr および 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 を戻します。

使用上の注意

  1. XPLINK アプリケーションは 2 つのスタック、上位アドレス方向へと増加するスタックおよび下位アドレスの方向へと増加するスタックを使用します。「size」引数は。下位アドレス方向へ増加するスタックを指します。
  2. Language Environment® ストレージ報告書は耐性ですが、アプリケーションが管理するスタック上の統計を保持しません。また、ランタイム・ストレージ・オプション、dsa 初期化のサブオプションも、アプリケーションが管理するスタックをサポートしません。

戻り値

正常に実行された場合、pthread_attr_setstack() はゼロを戻します。正常に実行されなかった場合、エラー番号を戻します。

エラー・コード
説明
EINVAL
次のエラー条件のいずれかである可能性があります。
  • size が PTHREAD_STACK_MIN よりも小さい
  • addr は、スタックとして使用するための正しい調整がされていない
  • (addr + size) は正しい調整が不足している
  • attr が初期設定されたスレッド属性オブジェクトを指していません。

⁄* 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);                                                                     
}                                                                               

関連情報