linuxマルチスレッドプログラミングThread Specific Data(TSD)


単一スレッド・プログラムでは、複数の関数間でデータを共有するために「グローバル変数」をよく使用します.マルチスレッド環境では、データ空間が共有されるため、グローバル変数もすべてのスレッドで共有されます.しかし、アプリケーション設計では、スレッドのプライベートなグローバル変数を提供する必要がある場合があります.あるスレッドでのみ有効ですが、複数の関数にわたってアクセスできます.たとえば、プログラムはスレッドごとにチェーンテーブルを維持する必要があり、同じ関数操作を使用する場合、同じ名前で異なる変数アドレスのスレッド関連データ構造を使用するのが最も簡単です.このようなデータ構造は、スレッドプライベートデータ(Thread-Specific Data,TSD)と呼ばれるPOSIXスレッドライブラリによって維持することができる
次の2つのAPIは、それぞれTSDの作成およびログアウトに使用されます.
int pthread_key_create(pthread_key_t* key, void (*destr_function)(void *))
int pthread_key_delete(pthread_key_t key)

次のコードはTSDの簡単なプレゼンテーションです.
#include
#include
#include

pthread_key_t key;

void echomsg( void* param )
{
        printf( "destructor excuted in thread %lu, param = %lu
", pthread_self(), *((unsigned long int*)param) ); } void* child1( void* param ) { unsigned long int tid = pthread_self(); printf( "thread %lu enter
", tid ); pthread_setspecific( key, ( void* )tid ); sleep( 2 ); unsigned long int val = *((unsigned long int *)pthread_getspecific( key )); printf( "thread %lu returns %lu
", tid, val ); sleep( 5 ); return ( void* )0; } void* child2( void* param ) { unsigned long int tid = pthread_self(); printf( "thread %lu enter
", tid ); pthread_setspecific( key, ( void* )tid ); sleep( 1 ); unsigned long int val = *( (unsigned long int*)pthread_getspecific( key ) ); printf( "thread %lu returns %lu
", tid, val ); sleep( 5 ); return ( void* )0; } int main() { pthread_t tid1, tid2; printf( "main thread enter
" ); pthread_key_create( &key, echomsg ); pthread_create( &tid1, NULL, child1, NULL ); pthread_create( &tid2, NULL, child2, NULL ); sleep( 10 ); pthread_key_delete( key ); printf( "main thread exit
" ); return 0; }

//コンパイルに-lpthreadを追加する
 g++ -lpthread -o TSD.out TSD.cpp

//main output
kennie@cbib:~/pthreadDIR$ ./TSD.out
main thread enter
thread 3075607408 enter
thread 3067214704 enter
thread 3067214704 returns 3067214704
thread 3075607408 returns 3075607408
destructor excuted in thread 3067214704, param = 3067214704
destructor excuted in thread 3075607408, param = 3075607408
main thread exit