2009-04-08 8 views
2

pthread_joinを使用せずに2つのスレッドの同期について以前に問い合わせましたが、pthread_cond_waitとpthread_cond_signalを使用して解決できました。 私は、単一の場所にこの機能をバンドルする小さな構造体を書いた:構造内のpthread条件待ちを使用する

struct ConditionWait 
{ 
    int     i_ConditionPredicate; 
    pthread_mutex_t  lock_Var; 
    pthread_cond_t  cond_Var; 
    int     i_ValidResult; 

    ConditionWait() 
    { 
     pthread_mutex_init(&lock_Var, NULL); 
     pthread_cond_init(&cond_Var, NULL); 
     i_ValidResult = 1; 
     i_ConditionPredicate = 0; 
    } 

    void Signal() 
    { 
     pthread_mutex_lock(&lock_Var); 
     i_ConditionPredicate = i_ValidResult; 
     pthread_cond_signal(&cond_Var); 
     pthread_mutex_unlock(&lock_Var); 
    } 

    void Wait() 
    { 
     pthread_mutex_lock(&lock_Var); 

     while(i_ConditionPredicate != i_ValidResult) 
     { 
      pthread_cond_wait(&cond_Var, &lock_Var); 
     } 
     pthread_mutex_unlock(&lock_Var); 
    } 
}; 

は、私は(待ちを呼び出すと仮定)と信号()2つの異なるスレッドから、これはスレッドセーフになります。同じオブジェクトの2つの関数で同じロックを使用すると、デッドロックや競合状態が発生しますか?

編集:今私のプログラムでこれを使用していますが、正常に動作します。私はそれがちょうど運であるかどうか確信していません

答えて

5

これは、あなたが決して "リセット"しないので、待機する次の試行はすべて成功し、決してブロックすることはありません。これがあなたが望むもの(またはあなたの状況に関係なく)であれば、これは安全であり、条件変数が通常どのように使用されるかです。

PS:この物のデストラクタでもpthread_mutex_destroy()pthread_cond_destroy()を使用する必要があります。