3

https://stackoverflow.com/a/189778/462608

非再帰的ミューテックスの場合、所有権の感覚はなく、どのスレッドが最初にミューテックスを取得したかに関係なく、通常はどのスレッドもミューテックスを解放できます。

ミューテックスについて私が調べたのは、スレッドが共有オブジェクトに対して何かをしたいときにミューテックスを取得し、やりたいことを完了するとロックを解放するということです。その間、他のスレッドはスリープまたはスピンロックすることができます。

上記の引用は、「どのスレッドが最初にミューテックスを取得したかに関係なく、通常、どのスレッドもミューテックスを解放できる」とはどういう意味ですか。?

私が見逃しているポイントは何ですか?

4

2 に答える 2

5

これはスレッドの実装によって異なる場合がありますが、質問に「pthreads」のタグを付けたので、pthreadミューテックスに興味があると思います(vxworksミューテックスではなく、提供したリンクが説明しているようです)。

そのため、pthreads では、mutex をロックする同じスレッドがロックを解除する必要があるという規則があります。このルールに違反した場合にエラーを生成するかどうか、または結果が未定義の動作になるかどうか (たとえば、デバッグ ビルドとリリース ビルドの場合) にかかわらず、ミューテックス オブジェクトに属性を設定できます。詳細については、pthread_mutexattr_settype 関数のマンページを参照してください。

于 2012-05-11T11:00:36.260 に答える
1

ロックしたスレッドではないスレッドによってpthread_mutex_tのロックを解除するための仕様は、ミューテックスのタイプによって異なります(せいぜいエラーを返します)。

ロックされなかったスレッドでミューテックスのロックを解除しようとすると、次のミューテックスタイプの未定義の動作になります。

  • PTHREAD_MUTEX_NORMAL
  • PTHREAD_MUTEX_DEFAULT

ロックされなかったスレッドでミューテックスのロックを解除しようとすると、EPERM次のタイプのエラー()が返されます。

  • PTHREAD_MUTEX_ERRORCHECK
  • PTHREAD_MUTEX_RECURSIVE

詳細については、 http://pubs.opengroup.org/onlinepubs/007904875/functions/pthread_mutex_lock.htmlを参照してください。

肝心なのは、たとえうまくいったように見えても、別のスレッドでミューテックスのロックを解除することは決してOKではないということです。

于 2012-05-11T19:19:13.857 に答える