Хорошо, давайте начнем с этого кода:
std::cout<<"Wait over"<<std::endl;
pthread_mutex_unlock(&cond_mutex);
thirdCharToRead = false;
Этот код говорит, что cond_mutex
не защищает thirdCharToRead
от одновременного доступа. Зачем? Потому что он изменяет thirdCharToRead
без удержания этого мьютекса.
Теперь посмотрите на этот код:
pthread_mutex_lock(&cond_mutex);
while(!thirdCharToRead)
{
std::cout<<"Waiting for condition"<<std::endl;
pthread_cond_wait(&cond,&cond_mutex);
}
Теперь цикл while
проверяет thirdCharToRead
, поэтому мы должны хранить любую блокировку, защищающую thirdCharToRead
от одновременного доступа, когда мы ее тестируем. Но цикл while
будет зацикливаться вечно, если thirdCharToRead
останется заблокированным для всего цикла, поскольку никакой другой поток не сможет его изменить. Таким образом, этот код имеет смысл, только если где-то в цикле мы снимаем блокировку, которая защищает thirdCharToRead
, и единственная блокировка, которую мы снимаем в цикле, это cond_mutex
при вызове pthread_cond_wait
.
Так что этот код имеет смысл, только если cond_mutex
защищает thirdCharToRead
.
Хьюстон, у нас проблема. Один фрагмент кода говорит, что cond_mutex
не защищает thirdCharToRead
, а один фрагмент кода говорит: cond_mutex
защищает thirdCharToRead
.