私のプログラムはデッドロックの問題があるようです。 pthread_cond_wait()のmutexを解放しない原因として考えられるものはありますか?
は基本的に私はこのようになりますクラスがあります。Foo
のコンストラクタで
class Foo {
public:
Foo();
void bar();
private:
void monitor();
bool condition_;
pthread_t monitor_;
pthread_mutex_t mutex_;
pthread_cond_t cv_;
};
を、私は別のスレッド(すなわち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()
機能がFoo
の(ctorのとデストラクタを除く)のみ公開インタフェースです。また、実行時にミューテックスを取得する必要があります。私の症状はbar()
は決してmutex_
を得ることができないということです。 pthread_cond_wait()
は、想定されているとおりにミューテックスを解放していないようです。そして、モニタスレッドを無効にすると(つまり競合状態がない場合)、bar()
は問題なく完了することができます。
もちろん、上記のコードは私の実際のコードを削除したものです。実際に私はこのコードに論理エラーはないと思うし、pthreadを正しく使っています。このデッドロック状況の原因が他にあるのではないかと疑いがあります。誰かがこれに手がかりを与えることができますか?ありがとう!
ところで、 'mutex_'と' cv_'は、どちらも属性がコンストラクタでNULLであるように適切に初期化されています。 –
pthreadの使用には明らかに間違ったことはありません。あなたは私たちにコンストラクタを見せることができますか? –