2011-10-26 30 views
0

私はお互いにデータを渡し、それらを少し処理するいくつかのスレッドを得ました。最後の2つのスレッド間で同期をとると、プログラムがクラッシュし始めました。サイクルは、他のスレッドがちょうどpthread_cond_signalがクラッシュする可能性がありますか?

pthread_mutex_lock(&mutex); 
pthread_cond_signal(&cond); 
pthread_mutex_unlock(&mutex); 
である同期部以外は同じまま私はちょうどそれだけで実行しているので、最後のスレッドの全体の内容をコメントしたスレッドので、代わりのデバッグで多くの経験を持っていません

と私はまた、クラッシュせずにアプリを作ったことをコメントした。

プログラムの残りの部分では、mutexや条件変数には何も依存しません。私がpthread_cond_signal(& cond);だけをコメントすれば、それも動作します。何が起こっているかについてのアイデア?

+0

他のスレッドはwhile(1)のみ実行していますか?ループがあるのですか? – Akron

+0

それはwhile(1)のみ – Pyjong

答えて

0

まあ、そのコードは実際に意味をなさない。ミューテックスで保護されている変数の値を変更しなかった場合、条件変数を通知する意味は何ですか?また、ミューテックスを保持しているかどうかにかかわらずシグナルを送ることができるので、ロック/アンロックは必要ありません。 (あなたは変数がのためにあるかの条件の基本を理解していない場合Condition Variablesを参照してください。)

しかしcondが正しく初期化されていない場合、それがクラッシュする唯一の可能性の高い方法は、condが破壊された場合、またはcondはで壊れましたメモリを上書きするもの

+0

コードは何もしませんが、それを持っているだけでクラッシュしてはいけません。私は、メモリの破損を次に探しますと思います。 – Pyjong

+0

いいえ、mutexと条件変数の両方が適切に初期化されていると仮定すると、そこに置くだけでクラッシュしてはなりません。 (一般的なバグは、他のスレッドがまだそれを使用している可能性があることを忘れている、同期プリミティブ、またはそれを含むオブジェクトを破棄するコードの他の塊を持つことです。) –

0

クラッシュする唯一の方法は、までです。は、未定義の動作を呼び出したときに発生します。これは、pthread_cond_signalコールの前にプログラム内のどこかで発生した可能性があります。または、UBがコール自体に存在する可能性があります(初期化されていない条件変数のアドレスを渡すことによって)。詳しい情報がなければ、知る方法はありません。

関連する問題