У меня есть некоторый код с множеством функций и потоков и множеством различных мьютексов.Иногда код работает хорошо, а иногда я получаю одну из этих ошибок
1) "/usr/include/boost/thread/pthread/mutex.hpp:111: boost :: mutex :: ~ mutex (): Утверждение '! Res' не удалось. "
2)" /usr/include/boost/thread/pthread/condition_variable.hpp:168: boost :: condition_variable_any :: ~ condition_variable_any (): Assertion '!pthread_mutex_destroy (& internal_mutex) 'не удалось. "
Я подумал, что, возможно, один из мьютексов разрушается до того, как его разблокируют.Итак, я исследовал все pthread_mutex_destroys в деструкторах, но не могу найти никаких проблем.
Например, один из деструкторов имеет следующий вид:
~class1(){
// unlock threads waiting at push or pop
pthread_mutex_lock(&mutex);
pthread_cond_signal(cv1);
pthread_cond_signal(cv2);
pthread_mutex_unlock(&mutex);
// wait for threads blocked in push or pop to exit
while(number_of_threads>0){
usleep(100);
}
//wait them to exit and destroy cv and mutex
pthread_mutex_lock(&mutex);
pthread_cond_destroy(&cv1);
pthread_cond_destroy(&cv2);
pthread_mutex_unlock(&mutex);
pthread_mutex_destroy(&mutex);
}
number_of_threads
увеличивается и уменьшаетсяв функциях push и pop, использующих мьютекс и условные переменные.
Как можно отследить код, чтобы узнать, где и почему возникла проблема.У меня много мьютексов и функций, поэтому найти проблему нелегко.Любые подсказки помогут.
Заранее спасибо