Ранее я спрашивал о синхронизации двух потоков без использования pthread_join, и мне удалось разрешить его, используя pthread_cond_wait и pthread_cond_signal.
Я написал небольшую структуру для объединения этих функций в одном месте:
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 () и Signal () из двух разных потоков, это будет потокобезопасным. Может ли взятие одной и той же блокировки в двух функциях одного и того же объекта вызвать взаимоблокировки или условия гонки?
Edit: я использую это сейчас в моей программе, и она отлично работает. Я не слишком уверен, что это просто удача