Проблема, для которой я ищу помощь, написана в пункте №.7. Перед этим я опишу структуру моего кода.
- Начиная с
main()
, создаются два потока thread1 и thread2 и инициализируются для двух функций fun1()
и fun2()
соответственно. - У меня есть мьютекс с именем
lock_mutex
и условные переменные с именами cond1
, cond2
, cond3
и cond4.
- У меня есть глобальные логические переменные
var1
, var2
,var3
и var4
все инициализированы как ложные. fun1()
выглядит следующим образом:
void fun1(){
while(1){
pthread_mutex_lock(&lock_mutex);
while(var1 is false)
pthread_cond_wait(&cond1,&lock_mutex);
//do some work
set var3 = true;
pthread_cond_signal(&cond3);
set var1=false;
pthread_mutex_unlock(&lock_mutex);
}
}
fun2()
выглядит следующим образом:
void fun2(){
while(1){
pthread_mutex_lock(&lock_mutex);
while(var2 is false)
pthread_cond_wait(&cond2,&lock_mutex);
//do some work
set var4 = true;
pthread_cond_signal(&cond4);
set var2=false;
pthread_mutex_unlock(&lock_mutex);
}
}
- В моем коде есть функции, которые содержат
lock_mutex
, выполняют некоторую работу и, когда это уместно, сигнализируют cond1
и cond2
, например, каждая (это отдельная функция):
функция A:
pthread_mutex_lock(&lock_mutex);
//do some work
set var1= true;
pthread_cond_signal(&cond1);
pthread_mutex_unlock(&lock_mutex);
функция B:
pthread_mutex_lock(&lock_mutex);
//do some work
set var2= true;
pthread_cond_signal(&cond2);
pthread_mutex_unlock(&lock_mutex);
функция C:
pthread_mutex_lock(&lock_mutex)
//do some work
while(var3 is false)
pthread_cond_wait(&cond3,&lock_mutex);
//do more work
set var3=false;
pthread_mutex_unlock(&lock_mutex);
функция D:
pthread_mutex_lock(&lock_mutex)
//do some work
while(var4 is false)
pthread_cond_wait(&cond4,&lock_mutex);
//do more work
set var4= false;
pthread_mutex_unlock(&lock_mutex);
7. fun1()
и fun2()
неоднократно сигнализируются функцией A и функцией B. Я ожидаю, что fun1()
и fun2()
будут вызывать функцию C и функцию D каждый раз, когда они сигнализируются.
Но fun1()
и fun2()
просыпаются только в первый раз.После этого они входят в цикл while, получают блокировку и ждут сигнала бесконечно и не просыпаются, несмотря на сигнализацию.
Я не могу понять причину этой проблемы и был бы очень благодаренна любое предложение.Если имеются какие-либо хорошие методы / инструменты отладки для такого рода программ, просим вас также сослаться на них.
Заранее большое спасибо.