Проблема, о которой я хочу найти, написана в пункте №. 7. До этого я описываю структуру своего кода.Использование мьютексов и переменных состояния pthreads
- Из
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
при необходимости , как это (каждая отдельная функция):
функция А:
pthread_mutex_lock(&lock_mutex);
//do some work
set var1= true;
pthread_cond_signal(&cond1);
pthread_mutex_unlock(&lock_mutex);
функция В:
pthread_mutex_lock(&lock_mutex);
//do some work
set var2= true;
pthread_cond_signal(&cond2);
pthread_mutex_unlock(&lock_mutex);
функция С:
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, приобретают блокировку и ждут сигнала неопределенно долго и не просыпаются, несмотря на сигнализацию.
Я не могу понять причину этой проблемы и был бы очень благодарен за любое предложение. Если есть какие-либо хорошие методы отладки/инструменты для такого рода программ, любезно отсылайте меня к ним.
С большим благодарением.
Любая идея о том, как я мог ее решить? – vpk
Я бы сказал, проверьте http://publib.boulder.ibm.com/iseries/v5r1/ic2924/index.htm?info/apis/users_76.htm, они используют серию операторов printf для отслеживания потока кода, возможно, этот подход прольет свет на то, что происходит –