2009-04-08 70 views
2

我以前曾詢問過如何在不使用pthread_join的情況下同步兩個線程,並且我能夠使用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); 
    } 
}; 

假設我打電話從兩個不同的線程wait()和信號(),這會是線程安全的。在相同對象的兩個函數中使用相同的鎖會導致死鎖還是競爭條件?

編輯:我現在在我的程序中使用它,它工作正常。我不太確定它是否只是運氣

回答

5

這將只會工作一次,在您喚醒線程等待後,下一次嘗試等待將全部成功並且永不阻止,因爲您從不「重置」條件謂詞。如果這是你想要的(或者你的情況並不重要),那麼是的,這是安全的,並且是條件變量通常如何使用的。 PS:你也應該在這個東西的析構函數中使用pthread_mutex_destroy()pthread_cond_destroy()