1

私は問題があります。

静的ミューテックスを初期化し、すべての関数でロックしようとしています。関数の 1 つで誤ってロックを解除するのを忘れていましたが、ミューテックス ロックを取得しようとする別の関数を呼び出すと、デッドロックが発生していないようです。

誰かがデッドロックが発生していないのはなぜこのようになっているのか説明してもらえますか?

問題のシナリオを説明するコード:

 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

 void main(void)
 {
   func1();  // Mutex acquired initially but not released at end
   func2();  // This function acquires mutex even though mutex was not released by func1();

 }


 void func1(void)
 {
   pthread_mutex_lock(&mutex);

   printf("I am in func1\n");

   //MUTEX NOT UNLOCKED
 }

 void func2(void)
 {
   pthread_mutex_lock(&mutex);

   printf("I am in func2\n");

   //MUTEX AGAIN NOT UNLOCKED
 }

func1() でミューテックスが解放されなかったので、 func2() でデッドロックが発生しないのはなぜですか?

4

2 に答える 2

2

仕様によると、PTHREAD_MUTEX_INITIALIZER はデフォルトのミューテックスと同等です。

デフォルトのミューテックス属性が適切な場合、マクロ PTHREAD_MUTEX_INITIALIZER を使用して、静的に割り当てられたミューテックスを初期化できます。この効果は、パラメーター attr を NULL として指定して pthread_mutex_init() を呼び出すことによる動的初期化と同じですが、エラー チェックは実行されません。

デフォルトのミューテックスの場合、呼び出し元のスレッドによってロックされているミューテックスをロックしようとすると、未定義の動作が発生します。

ミューテックス タイプが PTHREAD_MUTEX_DEFAULT の場合、ミューテックスを再帰的にロックしようとすると、未定義の動作が発生します。

于 2012-08-11T21:21:09.617 に答える
1

http://linux.die.net/man/3/pthread_mutex_lock

ミューテックス タイプが PTHREAD_MUTEX_DEFAULT の場合、ミューテックスを再帰的にロックしようとすると、未定義の動作が発生します。

あなたのプログラムには未定義の動作があるため、突然「ルートパーティションをフォーマットしています、むちゃむちゃ」と出力される可能性があります...誰が知っていますか

于 2012-08-11T21:21:34.680 に答える