問題タブ [critical-section]
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.
windows - Mutex はシステム コールを呼び出しますか?
CRITICAL_SECTION ロック (enter) とロック解除 (leave) は、ミューテックスが行うカーネル システム コールを行わずに CS テストがユーザー空間で実行されるため、効率的です。ロック解除は完全にユーザー空間で実行されますが、ReleaseMutex にはシステム コールが必要です。
この本でこれらの文を読んだところです。
カーネル システム コールの意味 関数の名前を教えてください。
私は英語初心者です。私はそれらをこのように解釈しました。
- CS テストはシステム コールを使用しません。
- ミューテックスのテストはシステムコールを使用します。(関数名がわからないので教えてください)
- CSロック解除はシステムコールを呼び出しません。
- ミューテックスのロック解除にはシステムコールが必要です。(関数名がわからないので教えてください)
別の質問です。
- CRITICAL_SECTION は WaitForSingleObject またはファミリ関数を呼び出す可能性があると思います。これらの関数はシステムコールを必要としませんか? そうだと思います。したがって、CS テストでシステム コールが使用されないことは、私にとって非常に奇妙です。
performance - DeleteCriticalSection が InitializeCriticalSection よりも遅いのはなぜですか?
アプリケーションの終了時またはサービスの停止時に、20000 を超える CriticalSections を削除する必要があります。しかし、DeleteCriticaSection 関数が非常に遅いことがわかりました。私はテストを行います:
結果:
良い提案はありますか?
c - プロセスがセマフォ (クリティカル セクション) に入ってスリープするとどうなりますか?
私の理解では、プロセスがクリティカルセクションに入ると、他のプロセスは同時に入ることができません。しかし、プログラムによって、そうではないことがわかります。
プロセス A を作成し、子プロセス B を作成します。子がクリティカル セクションに入り、寝ている間に、親もクリティカル セクションに入り、子が寝ていることに驚きました。それはどのように可能ですか?クリティカルセクションで同時に2つのプロセス?
multithreading - スレッドのミューテックスで up が行われると、スレッドはどうなりますか?
ミューテックスは、クリティカル セクションを保護するために使用されます。ミューテックスでダウンがすでに行われているとしましょう。それを行ったスレッドが CS にある間、他の 10 個のスレッドがそのすぐ後ろにあり、ミューテックスでダウンを行い、スリープ状態になります。最初のスレッドがクリティカル セクションを出てミューテックスを起動すると、10 個のスレッドすべてが起動し、実行しようとしていたこと、つまりクリティカル セクションに入る操作を再開しますか? それでは、10 個すべてが同時にクリティカル セクションに入る可能性があるということではないでしょうか?
c# - Web ファームの分散クリティカル セクション
5 つの Web サーバー間で負荷分散された約 50 の Web サイトがあります。それらはすべて Enterprise Library Caching を使用し、同じ Caching データベースにアクセスします。キャッシュ データベース内のアイテムは、ICacheItemRefreshAction 実装を使用して、数時間ごとに更新されます。
更新コードをクリティカル セクションに配置することで、1 つの Web サイトのみがキャッシュを更新することを保証したいと考えています。
Web サイトが単一のサーバー上の単一のアプリケーション プールで実行されている場合、lock()を使用できます。
Web サイトが単一サーバー上の個別のアプリケーション プールで実行されている場合、Mutexを使用できます。
ただし、これらは複数の Web サーバーにまたがるクリティカル セクションを保証しません。
現在、キャッシュ データベースにミューテックスとして機能する新しいキーを作成しています。これは通常は機能しますが、2 つのプロセスがクリティカル セクションに入る可能性はほとんどありません。
Web サービスを 2 回呼び出さないように、クリティカル セクションを保証する方法はありますか?
編集展開ポリシーによって禁止されるため、共有ファイルを使用できないことを追加する必要があります。
StackOverflow 参照:
multithreading - クリティカル セクションはいつ使用する必要がありますか?
これが取引です。私のアプリには、同じことを行うスレッドがたくさんあります-巨大なファイル(> 2GB)から特定のデータを読み取り、データを解析し、最終的にそのファイルに書き込みます。
問題は、1 つのスレッドがファイル A から X を読み取り、2 番目のスレッドが同じファイル A の X に書き込むことが時々発生する可能性があることです。問題は発生しますか?
I/O コードは、すべてのファイルに TFileStream を使用します。問題が発生するのではないかと心配して、I/O コードをローカル (静的クラス) に分割しました。分割されているため、重要なセクションがあるはずです。
以下のすべてのケースは、インスタンス化されていないローカル (静的) コードです。
ケース 1:
ケース 2:
ケース 3:
質問 1: 1 つ以上のスレッドが同時に呼び出しても問題がないように、クリティカル セクションが必要なのはどのような場合ですか?
質問 2: スレッド 1 がファイル A から X(エントリ) を読み取り、スレッド 2 がファイル A の X(エントリ) に書き込む場合、問題は発生しますか?
クリティカル セクションはいつ使用する必要がありますか? 私はそれを私の頭で想像しようとしますが、それは難しいです-スレッドは1つだけです:))
編集
これで合っているでしょうか?
{2GB ファイルごとのクラス}
2 つのスレッドが Read を呼び出した場合、問題が発生します:
ケース 1: 同じ TSpecificFile
ケース 2: 異なる TSpecificFile?
別のクリティカル セクションが必要ですか?
multithreading - 他のスレッドから VT データにアクセスしても安全ですか?
セカンダリ スレッドから VirtualTreeView データを変更しても安全ですか? はいの場合、クリティカル セクション (または Synchronize メソッド) を使用する必要がありますか?
残念ながら、他のスレッドから VT のデータ レコードに書き込んでいるときに、メイン スレッドがその再描画を呼び出し、この更新によって一度に同じレコードが読み取られることになります。アプリケーションで 2 つのスレッドしか使用していないことを補足します。
何かのようなもの ...
アップデート
クリティカル セクションをコードに追加しました。この関数がレコードへのポインターのみを返す場合でも、TMyCreatedThread クラスから GetNodeData を呼び出すのは本当に危険ですか?
どうもありがとう
よろしく
c++ - クリティカルセクションとは正確には何ですか?
これを少し明確にしたいだけです。EnterCriticalSectionのWindowsAPIを使用していると想像してください。私はそれらすべてをEnterCriticalSection(&criticalsection);
これはマルチスレッドのスレッド関数です
スレッドがクリティカル(パート1)に入ると、他のスレッドは、より多くのデータ1に実際に共有データがあるかどうかに関係なく、そのセクションに入ることができませんか?また、その間、他のスレッドもクリティカルセクションのパート2に入ることができません。
c++ - CriticalSection を使用してミューテックスのようなプログラムを作成する
例えば
関数呼び出しを呼び出すか、オブジェクトを離れると、それをロックして解放する関数を作成したいと考えています。
クラスのワークアウトを開始するにはどうすればよいですか?
multithreading - 選択的クリティカルセクション-条件付き
dbテーブルをパラメーターとして受け取るスレッドを取得しましたが、同時にそのdbテーブルに書き込めないという問題が発生しました。
TMyThreadの1つのインスタンスは「Member」のdbテーブルを持つことができ、別のインスタンスは「Staff」を持つことができますが、同じテーブルで2つのスレッドが開いている場合があります。
したがって、コードをクリティカルセクション(または同様のセクション)でラップする必要がありますが、(fMemberTable、fStaffTable)のようないくつかのクリティカルセクションのような汚いものは必要ありません...
面倒になるように8つのテーブルがあります
TCricalSection(fMemberTable).Enter; または、「スケーリング」して使用するのが簡単なこれを行うための何らかの方法はありますか?
他のテーブルを抑制したくないので、関数に関する1つのクリティカルセクションは意味がありません。