マルチスレッドのプログラミング

スタックアドレスの設定

pthread_attr_setstackaddr(3T)

pthread_attr_setstackaddr(3T) は、スレッドスタックのアドレスを設定します。

stackaddr 属性は、スレッドのスタックのベースを定義するものです。これを NULL 以外の値に設定すると (NULL がデフォルト)、そのスタックはそのアドレスで初期化されます。


プロトタイプ:

int	pthread_attr_setstackaddr(pthread_attr_t *tattr,void *stackaddr);

#include <pthread.h>

pthread_attr_t tattr;
void *base;
int ret;

base = (void *) malloc(PTHREAD_STACK_MIN + 0x4000);

/* 新しいアドレスを設定する */
ret = pthread_attr_setstackaddr(&tattr, base);

前の例では、新しいスレッドが使用するスタックのアドレスが base に格納されます。base の値が NULL ならば、pthread_create(3T) によって新しいスレッドに少なくとも PTHREAD_STACK_MIN バイトのスタックが割り当てられます。

戻り値

正常終了時は 0 です。それ以外の戻り値は、エラーが発生したことを示します。以下の条件が検出されると、この関数は失敗し、対応する値を戻します。


EINVAL

base または tattr の値が正しくありません。

次の例は、独自のスタックアドレスを指定してスレッドを生成する方法を示します。


#include <pthread.h>

pthread_attr_t tattr;
pthread_t tid;
int ret;
void *stackbase;

stackbase = (void *) malloc(size);

/* デフォルト属性で初期化する */
ret = pthread_attr_init(&tattr);

/* 属性に基底アドレスを設定する */
ret = pthread_attr_setstackaddr(&tattr, stackbase);

/* 属性 tattr に大きさのみを指定する */
ret = pthread_create(&tid, &tattr, func, arg); 

次の例は、独自のスタックアドレスと独自のスタックの大きさを指定してスレッドを生成する方法を示しています。


#include <pthread.h>

pthread_attr_t tattr;
pthread_t tid;
int ret;
void *stackbase;

int size = PTHREAD_STACK_MIN + 0x4000;
stackbase = (void *) malloc(size);

/* デフォルト属性で初期化する */
ret = pthread_attr_init(&tattr);

/* スタックの大きさも設定する */
ret = pthread_attr_setstacksize(&tattr, size);

/* 属性に基底アドレスを設定する */
ret = pthread_attr_setstackaddr(&tattr, stackbase);

/* アドレスと大きさを指定する */
ret = pthread_create(&tid, &tattr, func, arg);