問題タブ [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.
javascript - JavaScriptでミューテックスが必要ですか?
私はこのリンクを見ました:JavaScriptでの相互排除の実装。一方、javascriptにはスレッドがないことを読みましたが、それは正確にはどういう意味ですか?
イベントが発生した場合、コードのどこで割り込みできますか?
また、JSにスレッドがない場合、JSでミューテックスを使用する必要がありますか?
setTimeout()
具体的には、とによって呼び出される関数を使用すると、グローバルにアクセス可能な変数にどのような影響があるXmlHttpRequest
のか疑問に思っています。onreadystatechange
multithreading - Win32 API を使用して Java のような同期 (モニター) を実装するにはどうすればよいですか?
各 Java オブジェクト (およびそのクラス) には、関連付けられたモニターがあります。pthread 用語では、Java モニターは再入可能ミューテックスと条件変数の組み合わせに相当します。
ロックのために、Win32 API は Mutex オブジェクト (再入可能ですが重量が大きい) とクリティカル セクション (再入不可ですが軽量) を提供します。また、セマフォやイベントなどの他の同期構造も提供しますが、条件変数の明示的な概念はありません。
JVM を作成している場合、これらの Win32 の概念を使用して Java モニターを実装するにはどうすればよいでしょうか?
php - PHP 5.x 同期ファイル アクセス (データベースなし)
私は Java、C、および C++ に精通しています。これらの言語では、常に 1 つのスレッドのみがリソースにアクセスするように制御する方法があります。今、似たようなものを探していますが、PHP 5.x.
1つの例で私の問題を定式化するには:
ページロードカウンターの値である数値のみを格納するASCIIファイルがあります。アプリケーションの展開時に、ファイルは単純に 0 を保持します。アクセスごとに値が 1 ずつ増加します。目標は、ページの読み込みを追跡することです。
問題は、多くのユーザーがカウンターを含むページに同時にアクセスしている場合に発生します。スレッド A が現在の値を読み取ったとき、それが 11 だとしましょう。別のスレッド B が値を読み取りますが、まだ 11 です。次に、最初のスレッド A が読み取り値をインクリメントし、ファイルに 12 を書き込み、ファイルを閉じます。次に、2 番目のスレッド B が、11 だった読み取り値をインクリメントし、12 を取得して、それをファイルに書き込みます。値 12 がファイルに保存されますが、実際には 13 である必要があります。
別のプログラミング言語では、ミューテックスを使用してこれを解決していたでしょう。モジュールの一部として、ミューテックス、共有メモリ、およびその他の機能があることを理解しています。しかし、「ほとんどのサーバー」で機能するソリューションが欲しいです。プラットフォームに依存しません。ほとんどの安価な Web ホストにインストールされています。この問題の良い解決策はありますか? データベースを使用できない場合、どの方法を使用しますか?
multithreading - 再帰ロック (Mutex) と非再帰ロック (Mutex) の比較
POSIX では、mutex を再帰的にすることができます。これは、同じスレッドが同じミューテックスを 2 回ロックでき、デッドロックしないことを意味します。もちろん、ロックを 2 回解除する必要もあります。そうしないと、他のスレッドがミューテックスを取得できません。pthread をサポートするすべてのシステムが再帰的ミューテックスもサポートしているわけではありませんが、POSIX に準拠したい場合は、 .
他の API (より高レベルの API) も通常、ロックと呼ばれることが多いミューテックスを提供します。一部のシステム/言語 (Cocoa Objective-C など) は、再帰的ミューテックスと非再帰的ミューテックスの両方を提供します。一部の言語では、どちらか一方しか提供されません。たとえば、Java のミューテックスは常に再帰的です (同じスレッドが同じオブジェクトに対して 2 回「同期」する場合があります)。それらが提供する他のスレッド機能によっては、再帰的ミューテックスがなくても問題ないかもしれません。なぜなら、再帰的ミューテックスは自分で簡単に作成できるからです (より単純なミューテックス/条件操作に基づいて、再帰的ミューテックスを自分で実装しました)。
私がよく理解していないこと: 非再帰的ミューテックスは何に適していますか? 同じミューテックスを 2 回ロックすると、スレッドのデッドロックが必要になるのはなぜですか? それを回避できる高水準言語でさえ (たとえば、これがデッドロックするかどうかをテストし、デッドロックする場合は例外をスローする)、通常はそれを行いません。代わりに、スレッドをデッドロックさせます。
これは、誤って 2 回ロックして 1 回だけロックを解除した場合のみであり、再帰的ミューテックスの場合、問題を見つけるのが難しいため、代わりにすぐにデッドロックして、間違ったロックが表示される場所を確認しますか? しかし、ロックを解除するときにロック カウンターを返すことで同じことを行うことはできませんでした。最後のロックを解放し、カウンターがゼロではないことが確実な状況では、例外をスローしたり、問題をログに記録したりできませんか? または、私が見落としている非再帰的ミューテックスの他のより便利なユースケースはありますか? それとも、非再帰的ミューテックスは再帰的ミューテックスよりもわずかに高速になる可能性があるため、単なるパフォーマンスでしょうか? ただし、これをテストしたところ、違いはそれほど大きくありません。
windows - WaitForSingleObject が WAIT_FAILED を返す理由
MSDNによると
関数が失敗した場合、戻り値は WAIT_FAILED です。拡張エラー情報を取得するには、GetLastError を呼び出します。
コードは次のとおりです。
しかし、どのような理由が考えられるのでしょうか?
c++ - マルチスレッド C++ アプリでは、単純なブール値を保護するためにミューテックスが必要ですか?
OpenSceneGraph ライブラリで 3D レンダリングを行うマルチスレッド C++ アプリがあります。OSG のレンダー ループを、boost::threads を使用して別のスレッドとして開始し、共有状態を含むデータ構造をスレッドに渡すことを計画しています。レンダー ループをかなりタイトにする必要があり、OSG 自体がロックする必要がないようにしようとするため、同期には重すぎるもの (ミューテックスなど) を避けようとしています。共有状態のほとんどは、スレッドが開始される前に設定され、変更されることはありません。変更が必要なデータがいくつかありますが、これをダブル バッファリングする予定です。ただし、レンダリングを一時停止し、後でレンダリングを再開するようにスレッドに通知するための単純なブール値と、それを強制終了するための別のブール値があります。どちらの場合も、アプリ スレッドが bool を設定し、レンダリング スレッドはそれを読み取るだけです。これらのブールへのアクセスを同期する必要がありますか? 私が知る限り、発生する可能性のある最悪の事態は、一時停止または終了する前に、レンダリング ループが余分なフレームの間継続することです。
c# - C# でグローバル ミューテックスを使用するための適切なパターンは何ですか?
Mutex クラスは非常に誤解されており、Global ミューテックスはさらに誤解されています。
グローバル ミューテックスを作成するときに使用する適切で安全なパターンは何ですか?
うまくいくもの
- マシンのロケールに関係なく
- ミューテックスを適切に解放することが保証されています
- ミューテックスが取得されない場合、オプションで永久にハングしません
- 他のプロセスがミューテックスを放棄した場合に対処する
java - 同じオブジェクトで 2 回同期しますか?
同じオブジェクトで 2 回同期すると、Java で奇妙な動作が発生するかどうか疑問に思っていましたか?
シナリオは次のとおりです
どちらのメソッドもオブジェクトを使用し、同期されます。ロックされているため、最初のメソッドによって呼び出されたときに 2 番目のメソッドが停止しますか?
同じスレッドなのでそうは思いませんが、他に奇妙な結果が生じる可能性があるかどうかはわかりません.
c - グローバル構造から読み取るときにセマフォは必要ですか?
かなり基本的な質問ですが、どこにも尋ねられていません。
次のようなグローバル構造体 (C) があるとします。
written_frequently
この構造体への割り当てがアトミックであることを 100% 確信できないため、読み取りと書き込みを行うスレッドが多数ある場合は、メンバーにセマフォ (またはその他のロック) が必要であることは明らかです。.
多くのスレッドにread_only
メンバーを読み取らせ、書き込みを行わせない場合、読み取り専用の構造体アクセスにセマフォが必要ですか?
(直前と直後の場所が常に変更されているという事実がread_only
メンバーに影響を与えるべきではなく、値を読み取る複数のスレッドが互いに干渉するべきではないため、私はノーと言う傾向があります。しかし、よくわかりません. )
[編集: 私が何を意味しているのかを非常に具体的に明確にするために、この質問をもっとうまく行うべきだったことに今気づきました。当然のことながら、最初に質問したとき、関連する問題のすべてを理解できたわけではありません。もちろん、今質問を包括的に編集すると、これらの優れた回答がすべて台無しになります。私が意味したのは、次のようなものです。
私が尋ねた主な問題は、このデータは構造体の一部であるため、他の構造体メンバーの影響を受けているのでしょうか。
メンバーが int であり、したがって書き込みがアトミックである可能性が高いという事実は、この場合、実際には単なるニシンです。]
c# - returnステートメントはロックの内側または外側にある必要がありますか?
コードのどこかにreturnステートメントがあり、ロックの内側と外側にあることに気づきました。どれが最高ですか?
1)
2)
どちらを使うべきですか?