7

pthread 関数pthread_rwlock_wrlockの動作に関して問題があります。上記のリンクの仕様では、1 つのスレッドが書き込み用にロックをロックし、同じスレッドが再びロックすると、未定義の動作が発生することが示されています (x86 Linux ではこの関数を呼び出すことはヌープであり、PowerPC Linux ではスレッドを停止します)。

私が必要とする動作は、次の特性を持つ読み取り書き込みロックです。

  • スレッドによる読み取りロックは、次の場合に成功します。
    • ロックはどのスレッドにも保持されていません
    • ロックは、0 個以上のスレッド (呼び出しスレッドを含む) によってのみ読み取りロックされ、呼び出しスレッドによって読み取りまたは書き込みロックされる可能性があります。
  • 書き込みロックは、次の場合に成功します。
    • ロックは他のスレッドによって保持されていません
    • 現在のスレッドのみがロックを保持しています (読み取りまたは書き込み用)。

ではpthread_mutex_t、ロックの再帰性は初期化フラグを介して制御できますが、これは では不可能ですpthread_rwlock_t

私のオプションは何ですか?この種の同時実行プリミティブを実際に C で実装する必要があったことはありません。また、明らかな解決策が欠けていると思います。

4

1 に答える 1

7

正直なところ、再帰ロックにはいくつかの用途がありますが、一般的にはハックです。今はその記事を見つけられないようですが、Butenhof はこれについて素晴らしい暴言を吐いています。

質問に戻ります。「私はロックを持っています」というシグナルを送るスレッド固有のフラグを保持できます。施錠直後に設定し、解錠前に解除してください。これはそれにアクセスする唯一のスレッドであるため、安全なはずです。したがって、ロックしようとするときは、「ねえ、これはもうロックされていますか?」と確認するだけです。

余談ですが、スレッドが 2 回ロックしようとしても、設計に問題はありませんか?

編集

記事を見つけました。

しかし、それだけで十分だとしたら、なぜ POSIX には再帰的ミューテックスがあるのでしょうか?

あえてのせいで。

于 2011-08-19T17:45:03.970 に答える