問題タブ [recursive-mutex]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
4 に答える
5143 参照

c++ - 再帰的および非再帰的なロック (Mutex)

プログラムでデッドロックの問題が発生しています。だから私はロックについて読んでいますが、問題はほとんどの情報が一貫していないか、プラットフォームが定義されていないことです. 再帰ロック (Mutex) と非再帰ロック (Mutex)で、最も受け入れられている答えは次のとおりです。

再帰的ミューテックスには所有権があるため、ミューテックスを取得するスレッドは、ミューテックスを解放するスレッドと同じでなければなりません。非再帰的ミューテックスの場合、所有権の感覚はなく、どのスレッドが最初にミューテックスを取得したかに関係なく、通常、どのスレッドもミューテックスを解放できます。多くの場合、このタイプの「ミューテックス」は実際にはセマフォ アクションに近く、必ずしもミューテックスを除外デバイスとして使用するわけではなく、2 つ以上のスレッド間の同期またはシグナリング デバイスとして使用します。

解説では、人々はそれは正しくないと言い、それについての言及はありません. そう...

1) スレッド A で非再帰的ミューテックスをロックすると、スレッド B はロックを取得せずにロックを解除できますか?

2) スレッド A によって非再帰的ミューテックスでロックが取得され、スレッド B がロックを取得するために呼び出した場合、スレッド B はロックが解放されるまで待機してロックを取得しますか、それとも例外をスローしますか? 再帰的ミューテックスのこの場合はどうですか? (適切な結論を下すことができなかった他の質問でも議論されています)

3) 再帰ロックを使用する場合、プロセスの終了時に、すべての再帰ロックを解放する必要がありますか? (プロセスが終了する場所によっては発生しません)

4) 再帰的ロックと非再帰的ロックを慎重に組み合わせて使用​​する場合、どのような問題に注目していますか?

PS: Windows プラットフォームとstd::thread.

0 投票する
1 に答える
6949 参照

c++ - unique_lock を recursive_mutex で使用できますか?

thisによると、unique_locka を宣言することで再帰ロックに使用できstd::unique_lock<std::recursive_mutex>、実際には正常にコンパイルされます。

ただし、コード (gcc 4.8.2 および 4.9.0) を調べると、ロック メソッド自体を実装するのではなく、ロック メソッド自体を実装しているようにunique_lock見えます。_Mutex.lock

明らかに、これによりミューテックスの再帰的ロックが防止され、実際、再帰的にロックしようとするとresource_deadlock_would_occur例外がスローされます。

ここに何かが欠けていますか、これはバグですか、それともunique_lockのドキュメントが間違っていますか?

ティア!!!

0 投票する
2 に答える
118 参照

c++ - アクションlisting_6.1のC++同時実行がstd::recursive_mutexを使用しない理由

「C++ Concurrency In Action」という本を読んでいて、リスト 6.1 で使用されているミューテックスについて質問があります。コード スニペットは次のとおりです。

メソッドはpopミューテックスをロックしてから、空のミューテックスを呼び出します。ただし、ミューテックスは recursive_mutex ではなく、コードは適切に機能します。std::mutexしたがって、との実際の違いは何なのか疑問std::recursive_mutexです。

0 投票する
1 に答える
181 参照

c++ - recursive_mutex の所有権の最大レベルの下限は?

[thread.mutex.recursive] の引用:

オブジェクトを所有するスレッドは、そのオブジェクトに対してまたはをrecursive_mutex呼び出すことによって、追加レベルの所有権を取得できます。1 つのスレッドが取得できる所有権レベルの数は指定されていません。スレッドがオブジェクトの最大レベルの所有権を既に取得している場合、 への追加の呼び出しは失敗し、 への追加の呼び出しは type の例外をスローします。lock()try_lock()recursive_mutextry_lock()lock()system_error

「所有権の最大レベル」に 1 より大きい下限はありますか? 再帰的な pthread ミューテックスはどうですか?

0 投票する
1 に答える
292 参照

c - C - ミューテックス属性

複数の再帰的ミューテックスを初期化するために、ミューテックス属性を 1 つだけ作成して使用することはできますか? それとも、作成したいミューテックスごとに 1 つのミューテックス属性を作成する必要がありますか? 基本的に、次のコードは正しいですか?

0 投票する
1 に答える
712 参照

c++ - std::recursive_mutex で使用される所有者カウンターにアクセスする

アルゴリズムの決定が共有の深さに基づいている場合がありますstd::recursive_mutex

再帰的ミューテックスが何らかの使用カウントを保持し、ロック/ロック解除の呼び出しごとに増減することを読んだことがありますが、その情報にアクセスする方法はありますか?

0 投票する
1 に答える
161 参照

python - ctypes 経由で _thread.RLock のカウントに簡単にアクセスできますか?

クラスから継承し、基になる属性からデータを公開することで、 のcountプロパティを作成できます。threading._RLock._countこれは、例によって簡単に示されます。

  1. _thread.RLock経由でカウントを取得することで同じことを行うことは可能ctypesですか?
  2. 可能であれば、上記のバージョンよりもコードに利点がありますか?
  3. それが有利であるとすれば、カウントにアクセスするためにどのようなコードを書かなければなりませんか?