2009-04-08 4 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); 
    } 
}; 

내가이 스레드 안전 할 것, 두 개의 서로 다른 스레드에서 대기() 및 신호()를 호출한다고 가정. 동일한 객체의 두 함수에서 동일한 잠금을 사용하면 교착 상태 또는 경쟁 조건이 발생합니까?

편집 : 지금 내 프로그램에서 이것을 사용하고 있으며 정상적으로 작동합니다. 나는 그것이 단지 운이 좋은지 아닌지 잘 모르겠다.

답변

5

이것은 기다리는 스레드를 깨우고 나면 다음 번 대기하려는 시도가 모두 성공하고 절대로 조건 술어를 "재설정"하지 않으므로 결코 차단되지 않는다. 이것이 당신이 원하는 것 (또는 당신의 상황에서는 중요하지 않다)이라면 그렇습니다. 이것은 안전하고 일반적으로 조건 변수가 사용되는 방법입니다.

추신 :이 항목의 소멸자에도 pthread_mutex_destroy()pthread_cond_destroy()을 사용해야합니다.