0

わかりました..ここに問題の背景があります。ミューテックスで保護しようとしている「重要な」コードがいくつかあります。それはこのようなものになります

Mutex.Lock()

// 重要なコード // 一部のファイル IO

Mutex.Unlock()。

今の問題は、これが原因で私のプログラムが「スタック」しているように見えることです。例を挙げて説明しましょう。

Thread_1 が入ります。Mutex.Lock() に移動し、重要なコードの実行を開始します。重要なコードでは; ファイル IO を実行する必要があります。この時点で; 「コンテキスト切り替え」が発生し、Thread_2 が入って Mutex.Lock() でブロックされると思います (Thread_1 にロックがあるため)。すべて問題ないようですが、私の場合は。ここでプログラムが「ハング」します..私が考えることができる唯一のことは、どういうわけかThread_2が永遠にブロックし続け、Thread_1に戻らないということです??

詳細: Linux で pthread_mutex_init と pthread_mutex_lock を使用する。

4

5 に答える 5

5

他の人が述べたように、おそらくデッドロックがあります。

サイドノート:

コードの重要なブロックでキャッチされない例外がスローされないようにする必要があります。そうしないと、ロックが解除されません。RAIIロックを使用して、この問題を解決できます。

class SingleLock {
public:
  SingleLock(Mutex &m) : m(m) { m.Lock(); }
  ~SingleLock() { m.Unlock(); }
private:
  Mutex m;
};

...
{ 
  SingleLock lock(mutex);
  // critical code // some file IO

}
...
于 2009-12-28T22:25:53.950 に答える
2

これは、Thread_1 がミューテックス内にあり、Thread_2 が何かを解放するのを待っているデッドロックのように聞こえますが、Thread_2 はミューテックスに入るのを待っているため、Thread_1 が必要とするものを解放できません。

編集:質問のシナリオにより厳密に一致するようにスレッド名を交換し、「ミューテックスに」を追加しました

于 2009-12-28T21:55:28.320 に答える
1

このような場合の最善の解決策は、デバッガ ( gdb? ) を使用することです。デバッガー ( eclipse? ) を備えた IDE を使用して、デバッグをより簡単かつ視覚的にすることをお勧めします。

このように、すべてのスレッドが待機している場所が表示されます。

私が期待するのは、スレッド 1 がミューテックスをロックしてクリティカル セクションに入る、IO でスタックする (間違った読み取りまたは無限ループの可能性がある)、スレッド 2 が通常、ミューテックスのロックが解除されるのを待機していることです。

デッドロックは単一のミューテックスでは発生しないため、これはデッドロックではないようです!

于 2009-12-28T22:19:01.203 に答える
0

ロックが 1 つしかない限り、コンテキスト スイッチは関係ありません。もう一方のスレッドは、ロックを取得するまでロックを待機するだけなので、最初のスレッドに影響を与えることはできません。したがって、問題はどういうわけか最初のスレッドにあります。デバッガーはマルチスレッドにはほとんど役に立ちませんが、デッドロックは通常簡単に解決できます。誰かがおそらく最初のスレッドが何らかの形で無限ループにあると指摘したからです。

于 2009-12-28T22:24:49.303 に答える
0

Does the File I/O need to be part of the critical section? If Thread 1 is doing a blocking read, and Thread 2 is what is supposed to be writing to that file (or pipe or similar), then Thread 1 will never return to release the mutex. You should evaluate your critical sections to determine what actually needs to be protected by the mutex. It's considered good practice to have your critical sections be as small as possible.

于 2009-12-28T22:27:43.993 に答える