В дополнение к некорректному использованию различных мьютексов ваша программа не следует логике.На какое условие указывает переменная условия?(Это называется «предикатом».) Без предиката вы получите потерянные пробуждения.
Функция pthread_cond_wait
, несмотря на свое название, не является условным ожиданием.Это безусловное ожидание для условия.Вы должны вызывать его только тогда, когда нужно ждать условия.
Предположим, вы и ваша сестра делите машину, и вы не можете пользоваться машиной, когда ваша сестра одолжила ее, поэтому вы ждете свою сеструприйти домой.Ну, если она уже дома, ты будешь ждать долго!(И если она придет домой, но к тому времени, как вы доберетесь до машины, она и машина уйдут, вам придется снова подождать.)
Шаблон (для вас):
// let's get the car
pthread_mutex_lock(&mutex_that_protects_car);
while(car==SISTER_HAS_CAR) // car is gone
pthread_mutex_wait(&condition_variable, &mutex_that_protects_car);
car=BROTHER_HAS_CAR; // it's my car now
pthread_mutex_unlock(&mutex_that_protects_car);
// we now have the car
и для вашей сестры:
// we are done with the car, make it free
pthread_mutex_lock(&mutex_that_protects_car);
car=CAR_IS_FREE;
pthread_cond_broadcast(&condition_variable); // he can have the car
pthread_mutex_unlock(&mutex_that_protects_car);
Обратите внимание, что состояние автомобиля должно быть защищено одним общим мьютексом.Состояние автомобиля является предикатом, и оно защищено мьютексом и совместно используется потоками.
Обратите также внимание, что мы вызываем pthread_cond_wait
в то время и только тогда, когда следует ожидать условия.Мы не ждем, когда машина освободится.И мы продолжаем ждать, если она снова схватит машину, прежде чем мы сможем ее схватить.