У моей программы, похоже, проблема с тупиком.
В основном у меня есть класс, который выглядит так:
class Foo {
public:
Foo();
void bar();
private:
void monitor();
bool condition_;
pthread_t monitor_;
pthread_mutex_t mutex_;
pthread_cond_t cv_;
};
В конструкторе Foo
я вызываю monitor()
в отдельном потоке (а именно monitor_
). Эта monitor()
функция выполняет следующие действия:
pthread_mutex_lock(&mutex_);
while (true) {
while (!condition_) {
pthread_cond_wait(&cv_, &mutex_);
}
// do something
// and then setting condition_ to false
condition_ = false;
}
pthread_mutex_unlock(&mutex_);
Функция bar()
является единственным общедоступным интерфейсом (исключая ctor и dtor) из Foo
. Также необходимо получить мьютекс в своем исполнении. Мой симптом в том, что bar()
никогда не сможет приобрести mutex_
. Похоже, что pthread_cond_wait()
не освобождает мьютекс, как это должно быть. И если я отключу поток монитора (таким образом, не участвуя в гонках), тогда bar()
сможет без проблем запустить его до конца.
Конечно, приведенный выше код является урезанной версией моего реального кода. На самом деле я думаю, что в этом коде нет логической ошибки, и я правильно использую pthread. Я подозреваю, есть ли другие причины для этой тупиковой ситуации. Кто-нибудь может дать подсказку по этому поводу? Спасибо!