linuxマルチスレッドプログラミング反発ロックと条件変数
条件変数はスレッド間で共有されるグローバル変数を用いて同期するメカニズムであり、主に2つの動作を含む:1つのスレッドは「条件変数の条件成立」を待って掛け、もう1つのスレッドは「条件成立」(条件成立信号を与える)を使用し、競合を防止するために、条件変数の使用は常に1つの反発ロックと結合する.
次の例では、反発ロックと条件変数の組み合わせの使用、および条件待機動作への影響の取り消しを示します.例では、2つのスレッドが起動され、同じ条件変数が待機します.
// pthread_cond_waitは先にpthreadを解除しますmutex_ロックロックロックされたmutexは、再び起動されるまで待機キューでスリープします(多くの場合、待機条件が成立して起動されます.起動後、このプロセスはまずpthread_mutex_lock(&mutex)をロックします.リソースの再読み込み
//コンパイル
//運転結果
次の例では、反発ロックと条件変数の組み合わせの使用、および条件待機動作への影響の取り消しを示します.例では、2つのスレッドが起動され、同じ条件変数が待機します.
#include
#include
#include
pthread_mutex_t mutex; //
pthread_cond_t cond; //
void* child1( void* param )
{
pthread_cleanup_push( (void (*)(void*))pthread_mutex_unlock, (void*)&mutex );
while( 1 )
{
printf( "thread 1 get running
" );
printf( "thread 1 pthread_mutex_lock returns %d
", pthread_mutex_lock( &mutex ) );
pthread_cond_wait( &cond, &mutex ); //
printf( "thread 1 condition applied
" );
pthread_mutex_unlock( &mutex );
sleep( 5 );
}
pthread_cleanup_pop( 0 );
return ( void* )0;
}
void* child2( void* param )
{
while( 1 )
{
sleep( 3 );
printf( "thread 2 get running
" );
printf( "thread 2 pthread_mutex_lock returns %d
", pthread_mutex_lock( &mutex ) );
pthread_cond_wait( &cond, &mutex ); //
printf( "thread 2 condition applied
" );
pthread_mutex_unlock( &mutex );
sleep( 1 );
}
return ( void* )0;
}
int main()
{
pthread_t tid1, tid2;
printf( "hello, condition variable test
" );
pthread_mutex_init( &mutex, NULL ); //
pthread_cond_init( &cond, NULL ); //
pthread_create( &tid1, NULL, child1, NULL ); // new tid1
pthread_create( &tid2, NULL, child2, NULL ); // new tid2
do
{
sleep( 2 );
pthread_cancel( tid1 ); // tid1, google cancel point
sleep( 2 );
pthread_cond_signal( &cond ); //
}while( 1 );
sleep( 100 );
pthread_exit( 0 );
return 0;
}
// pthread_cond_waitは先にpthreadを解除しますmutex_ロックロックロックされたmutexは、再び起動されるまで待機キューでスリープします(多くの場合、待機条件が成立して起動されます.起動後、このプロセスはまずpthread_mutex_lock(&mutex)をロックします.リソースの再読み込み
//コンパイル
kennie@cbib:~/pthreadDIR$ g++ -lpthread -o mutex_con.out mutex_con.cpp
//運転結果
hello, condition variable test
thread 1 get running
thread 1 pthread_mutex_lock returns 0
thread 2 get running
thread 2 pthread_mutex_lock returns 0
thread 2 condition applied
thread 2 get running
thread 2 pthread_mutex_lock returns 0
thread 2 condition applied
thread 2 get running
thread 2 pthread_mutex_lock returns 0
thread 2 condition applied
thread 2 get running
thread 2 pthread_mutex_lock returns 0
thread 2 condition applied
thread 2 get running
thread 2 pthread_mutex_lock returns 0
thread 2 condition applied
thread 2 get running
thread 2 pthread_mutex_lock returns 0
thread 2 condition applied
......