Man page - pthread_key_create(3)

Packages contains this manual

Available languages:

en fr ja ro

Manual

PTHREAD_SPECIFIC

名 前
書 åŧ
čĒŦ 明
čŋ” り 値
エ ナ ãƒŧ
著 者
é–ĸ 逪 項 į›Ž
例

名 前

pthread_key_create, pthread_key_delete, pthread_setspecific, pthread_getspecific - ゚ ãƒŦ ッ ド å›ē 有 デ ãƒŧ ã‚ŋ ぎ įŽĄ ᐆ

書 åŧ

#include <pthread.h>

int pthread_key_create(pthread_key_t * key , void (* destr_function ) (void *));

int pthread_key_delete(pthread_key_t key );

int pthread_setspecific(pthread_key_t key , const void * pointer );

void * pthread_getspecific(pthread_key_t key );

čĒŦ 明

プ ロ グ ナ ム で は ゚ ãƒŦ ッ ド ご と ãĢ 値 ぎ į•° ãĒ る グ ロ ãƒŧ バ ãƒĢ 変 数 や 静 įš„ 変 数 が し ば し ば åŋ… čρ と ãĒ る 。 複 数 ぎ ゚ ãƒŦ ッ ド は 1 つ ぎ ãƒĄ ãƒĸ ãƒĒ įŠē 間 を å…ą 有 す る た め 、 通 常 ぎ 変 数 で は こ れ を 原 įž す る こ と が で き ãĒ い 。 ゚ ãƒŦ ッ ド å›ē 有 デ ãƒŧ ã‚ŋ は 、 こ ぎ åŋ… čρ 性 へ ぎ POSIX ゚ ãƒŦ ッ ド ぎ į­” え で あ る 。

そ れ ぞ れ ぎ ゚ ãƒŦ ッ ド は ゚ ãƒŦ ッ ド å›ē 有 デ ãƒŧ ã‚ŋ (thread-specific data) 領 域 、 į•Ĩ し ãĻ TSD 領 域 と い う プ ナ イ ベ ãƒŧ ト ãĒ ãƒĄ ãƒĸ ãƒĒ ブ ロ ッ ク を äŋ 有 し ãĻ い る 。 こ ぎ 領 域 は TSD キ ãƒŧ を イ ãƒŗ デ ッ ク ゚ と し ãĻ įŽĄ ᐆ さ れ る 。 TSD 領 域 で は void * 型 ぎ 値 を TSD キ ãƒŧ ãĢ įĩ ãŗ äģ˜ ã‘ る 。 TSD キ ãƒŧ は す ず ãĻ ぎ ゚ ãƒŦ ッ ド ãĢ å…ą 通 で あ る が 、 TSD キ ãƒŧ ãĢ įĩ ãŗ äģ˜ ã‘ ら れ る 値 は ゚ ãƒŦ ッ ド ご と ãĢ į•° ãĒ る よ う ãĢ す る こ と が で き る 。

å…ˇ äŊ“ įš„ ãĢ い え ば 、 TSD 領 域 は void * 型 ぎ ポ イ ãƒŗ ã‚ŋ ぎ 配 列 と し ãĻ 、 TSD キ ãƒŧ は こ ぎ 配 列 ãĢ 寞 す る 整 数 値 ぎ イ ãƒŗ デ ッ ク ゚ と し ãĻ 、 TSD キ ãƒŧ ãĢ įĩ ãŗ äģ˜ ã‘ ら れ る 値 は å‘ŧ ãŗ å‡ē し ゚ ãƒŦ ッ ド ぎ 寞 åŋœ す る 配 列 čρ į´  と し ãĻ čĻ‹ え る 。

゚ ãƒŦ ッ ド が į”Ÿ 成 さ れ る と 、 TSD 領 域 は す ず ãĻ ぎ キ ãƒŧ ãĢ 寞 す る 値 が NULL ãĢ ãĒ る よ う 初 期 化 さ れ る 。

pthread_key_create は 新 し い TSD キ ãƒŧ を įĸē äŋ す る 。 キ ãƒŧ は key で 指 し į¤ē さ れ る 領 域 ãĢ æ ŧ į´ さ れ る 。 あ る 時 į‚š で įĸē äŋ で き る キ ãƒŧ ぎ 数 ãĢ は åˆļ 限 が あ り 、 そ ぎ 最 大 値 は PTHREAD_KEYS_MAX で あ る 。 čŋ” さ れ た キ ãƒŧ ãĢ įĩ ãŗ äģ˜ ã‘ ら れ る 初 期 値 は 、 そ ぎ 時 į‚š で 原 行 さ れ ãĻ い る ゚ ãƒŦ ッ ド す ず ãĻ ãĢ お い ãĻ NULL で あ る 。

åŧ• 数 destr_function ãĢ NULL äģĨ 外 ぎ 値 を 指 厚 す る こ と で 、 そ ぎ キ ãƒŧ ãĢ 寞 åŋœ す る デ ゚ ト ナ ク ã‚ŋ é–ĸ 数 を į™ģ 錞 す る こ と が で き る 。 ゚ ãƒŦ ッ ド が pthread_exit や キ ãƒŖ ãƒŗ ã‚ģ ãƒĢ ãĢ よ ãŖ ãĻ įĩ‚ äē† ã™ る と 、 そ ぎ ゚ ãƒŦ ッ ド 中 で キ ãƒŧ ãĢ įĩ ãŗ äģ˜ ã‘ ら れ た 値 を åŧ• 数 と し ãĻ é–ĸ 数 destr_function が å‘ŧ ãŗ å‡ē さ れ る 。 値 が NULL ぎ å ´ 合 ãĢ は é–ĸ 数 destr_function は å‘ŧ ãŗ å‡ē さ れ ãĒ い 。 ゚ ãƒŦ ッ ド įĩ‚ äē† æ™‚ ãĢ デ ゚ ト ナ ク ã‚ŋ é–ĸ 数 が å‘ŧ ãŗ å‡ē さ れ る 順 åē ã¯ 不 厚 で あ る 。

デ ゚ ト ナ ク ã‚ŋ é–ĸ 数 が å‘ŧ ãŗ å‡ē さ れ る 前 ãĢ 、 įž 在 ぎ ゚ ãƒŦ ッ ド ãĢ お い ãĻ キ ãƒŧ ãĢ įĩ ãŗ äģ˜ ã‘ ら れ る 値 は NULL ãĢ ãĒ る 。 し か し 、 デ ゚ ト ナ ク ã‚ŋ é–ĸ 数 は NULL äģĨ 外 ぎ 値 を そ ぎ キ ãƒŧ や ãģ か ぎ キ ãƒŧ ãĢ įĩ ãŗ äģ˜ ã‘ る か も し れ ãĒ い 。 こ れ を å‡Ļ ᐆ す る た め 、 す ず ãĻ ぎ 非 NULL ぎ 値 ãĢ 寞 す る デ ゚ ト ナ ク ã‚ŋ é–ĸ 数 を す ず ãĻ å‘ŧ ãŗ å‡ē し た あ と ãĢ デ ゚ ト ナ ク ã‚ŋ é–ĸ 数 ぎ あ る 非 NULL ぎ 値 が ぞ だ 掋 ãŖ ãĻ い る å ´ 合 ãĢ は 、 デ ゚ ト ナ ク ã‚ŋ é–ĸ 数 ぎ å‘ŧ ãŗ å‡ē し å‡Ļ ᐆ は įš° り čŋ” さ れ る 。 LinuxThreads ぎ 原 čŖ… で は 、 PTHREAD_DESTRUCTOR_ITERATIONS 回 įš° り čŋ” す と 、 た と え デ ゚ ト ナ ク ã‚ŋ é–ĸ 数 ぎ あ る 非 NULL ぎ 値 が 掋 ãŖ ãĻ い ãĻ も 、 å‡Ļ ᐆ は 中 æ­ĸ さ れ る 。 LinuxThreads äģĨ 外 ぎ 原 čŖ… で は į„Ą 限 ãƒĢ ãƒŧ プ ãĢ é™Ĩ る か も し れ ãĒ い 。

pthread_key_delete は TSD キ ãƒŧ を č§Ŗ 攞 す る 。 そ ぎ 時 į‚š で 原 行 中 ぎ ゚ ãƒŦ ッ ド で キ ãƒŧ ãĢ 非 NULL ぎ 値 が įĩ ãŗ äģ˜ ã‘ ら れ ãĻ い る か お う か を チ ェ ッ ク し た り 、 キ ãƒŧ ãĢ 寞 åŋœ す る デ ゚ ト ナ ク ã‚ŋ é–ĸ 数 を å‘ŧ ãŗ å‡ē し た り は し ãĒ い 。

pthread_setspecific は å‘ŧ ãŗ å‡ē し ゚ ãƒŦ ッ ド で key ãĢ įĩ ãŗ äģ˜ ã‘ ら れ る 値 を 、 与 え ら れ た pointer ãĢ 変 更 す る 。

pthread_getspecific は å‘ŧ ãŗ å‡ē し ゚ ãƒŦ ッ ド で そ ぎ 時 į‚š で key ãĢ įĩ ãŗ äģ˜ ã‘ ら れ ãĻ い る 値 を čŋ” す 。

čŋ” り 値

pthread_key_create お よ ãŗ pthread_key_delete 、 pthread_setspecific は 成 功 す る と 0 を 、 å¤ą 敗 す る と 非 0 ぎ エ ナ ãƒŧ ã‚ŗ ãƒŧ ド を čŋ” す 。 成 功 ぎ å ´ 合 、 pthread_key_create は 新 し く įĸē äŋ さ れ た キ ãƒŧ を åŧ• 数 key で 指 し į¤ē さ れ る 領 域 ãĢ æ ŧ į´ す る 。

pthread_getspecific は 、 成 功 す る と キ ãƒŧ key ãĢ įĩ ãŗ äģ˜ ã‘ ら れ た 値 を 、 エ ナ ãƒŧ ぎ å ´ 合 ãĢ は NULL を čŋ” す 。

エ ナ ãƒŧ

pthread_key_create は エ ナ ãƒŧ ぎ å ´ 合 ãĢ æŦĄ ぎ よ う ãĒ エ ナ ãƒŧ ã‚ŗ ãƒŧ ド を čŋ” す :

EAGAIN

PTHREAD_KEYS_MAX だ け ぎ キ ãƒŧ が す で ãĢ įĸē äŋ さ れ ãĻ い る 。

pthread_key_delete お よ ãŗ pthread_setspecific は エ ナ ãƒŧ ぎ å ´ 合 ãĢ æŦĄ ぎ よ う ãĒ エ ナ ãƒŧ ã‚ŗ ãƒŧ ド を čŋ” す :

EINVAL

key は 有 劚 ãĒ 、 įĸē äŋ さ れ た TSD キ ãƒŧ で は ãĒ い 。

pthread_getspecific は 、 key が 有 劚 ãĒ 、 įĸē äŋ さ れ た TSD キ ãƒŧ で ãĒ い å ´ 合 ãĢ は NULL を čŋ” す 。

著 者

Xavier Leroy <Xavier.Leroy@inria.fr>

é–ĸ 逪 項 į›Ž

pthread_create(3), pthread_exit(3), pthread_testcancel(3).

例

æŦĄ ぎ ã‚ŗ ãƒŧ ド で は 、 100 バ イ ト ぎ ゚ ãƒŦ ッ ド å›ē 有 ぎ 配 列 を įĸē äŋ し 、 ゚ ãƒŦ ッ ド ぎ įĩ‚ äē† ã¨ と も ãĢ č‡Ē 動 で č§Ŗ 攞 す る :

/* ゚ ãƒŦ ッ ド å›ē 有 バ ッ フ ã‚Ą ぎ キ ãƒŧ */
static pthread_key_t buffer_key;

/* 1 回 限 り ぎ キ ãƒŧ ぎ 初 期 化 */
static pthread_once_t buffer_key_once = PTHREAD_ONCE_INIT;

/* ゚ ãƒŦ ッ ド å›ē 有 ぎ バ ッ フ ã‚Ą を įĸē äŋ す る */
void buffer_alloc(void)
{
pthread_once(&buffer_key_once, buffer_key_alloc);
pthread_setspecific(buffer_key, malloc(100));
}

/* ゚ ãƒŦ ッ ド å›ē 有 ぎ バ ッ フ ã‚Ą を čŋ” す */
char * get_buffer(void)
{
return (char *) pthread_getspecific(buffer_key);
}

/* キ ãƒŧ を įĸē äŋ す る */
static void buffer_key_alloc()
{
pthread_key_create(&buffer_key, buffer_destroy);
}

/* ゚ ãƒŦ ッ ド å›ē 有 ぎ バ ッ フ ã‚Ą を č§Ŗ 攞 す る */
static void buffer_destroy(void * buf)
{
free(buf);
}