linuxマルチスレッドプログラミング反発ロックと条件変数


条件変数はスレッド間で共有されるグローバル変数を用いて同期するメカニズムであり、主に2つの動作を含む:1つのスレッドは「条件変数の条件成立」を待って掛け、もう1つのスレッドは「条件成立」(条件成立信号を与える)を使用し、競合を防止するために、条件変数の使用は常に1つの反発ロックと結合する.
次の例では、反発ロックと条件変数の組み合わせの使用、および条件待機動作への影響の取り消しを示します.例では、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
......