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