問題タブ [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.
c++ - VC++ 2010: 奇妙なクリティカル セクション エラー
私のプログラムは、再現できる小さなシナリオでランダムにクラッシュしますが、ntdll.dll の mlock.c (VC++ ランタイム ファイル) で発生し、スタック トレースが表示されません。ただし、スレッド関数の1つで発生することは知っています。
これは、プログラムがクラッシュする mlock.c コードです。
エラーは「無効なハンドルが指定されました」です。locknum を見ると、_locktable のサイズよりも大きい数値なので、これはある程度理にかなっています。
これは、クリティカル セクションの使用法に関連しているようです。CCriticalSection ラッパー クラスとそれに関連する RAII ガードである CGuard を介して、スレッドで CRITICAL_SECTIONS を使用しています。さらに混乱を避けるために、両方の定義をここに示します。
これはクラッシュしているスレッド関数です:
どこに入ってCCriticalSection
くる?すべてのオブジェクトには、 RAII ロックを介して使用するCImage
オブジェクトが含まれています。さらに、everyには、参照カウントを実装するオブジェクトが含まれています。そのために、2 つの も含まれています。1 つはデータ用で、もう 1 つは参照カウンター用です。これらの相互作用の良い例は、デストラクタで最もよく見られます。CCriticalSection
CGuard
CImage
CSharedMemory
CCriticalSection
この種のエラーに遭遇した人はいますか? なにか提案を?
編集: コール スタックをいくつか確認しました。コールは ~CSharedMemory からのものです。したがって、競合状態が存在する必要があります
編集:CSharedMemoryコードの詳細はこちら
multithreading - クリティカルセクションのあるDelphiでのキャッシュ整合性の問題を回避しますか?
マルチプロセッサマシンでのメモリキャッシュの一貫性の問題に対処するMSDNの記事「同期とマルチプロセッサの問題」を読みました。彼らが提供する例では競合状態が発生する可能性があるとは思わなかったので、これは本当に私にとって目を見張るものでした。この記事では、メモリへの書き込みが、私のコードで記述された順序で(他のCPUの観点から)実際には発生しない可能性があることを説明しています。これは私にとって新しいコンセプトです!
この記事では、2つのソリューションを提供します。
- 複数のCPU間でキャッシュの一貫性が必要な変数に「volatile」キーワードを使用します。これはC/C ++キーワードであり、Delphiでは使用できません。
- InterlockExchange()およびInterlockCompareExchange()を使用します。これは、必要に応じてDelphiで実行できることです。少し面倒なようです。
この記事では、「次の同期関数は、適切なバリアを使用してメモリの順序付けを保証します。•クリティカルセクションに出入りする関数」についても言及しています。
これは私が理解していない部分です。これは、クリティカルセクションを使用する関数に制限されているメモリへの書き込みが、キャッシュの一貫性やメモリの順序の問題の影響を受けないことを意味しますか?Interlock *()関数に反対するものは何もありませんが、ツールベルトに別のツールがあると便利です。
c++ - クリティカルセクションをネストすることは有効ですか?
たとえば、これは有効ですか?
明らかに、私は意図的にこれを行うことはありませんが、複雑な(検索などの)アルゴリズムのオブジェクトをロックするために「第1レベル」が呼び出され、「第2レベル」が呼び出されるような関数呼び出しの結果としてこれが発生した場合はどうなりますか?そのオブジェクトのアクセサ関数で呼び出されますか?
c# - C#でクラスの「スプール」サービスを作成する方法
私はC#プログラミングをかなり言語に合わせて調べています。オブジェクト指向プログラミング全般と、複数のスレッドを実行することの意味を大まかに理解していると思いますが、実際の実装はスクラブと同じです。
私が探しているのは、多くのスレッドが独立して実行され、相互作用するツールを作成することです。各スレッドは独自のタスクを実行し、他のスレッドを呼び出すことができます。
(異なるスレッドから同時に発生する複数の更新で何も失わずに)通信を確保するための私の戦略は、外部と呼ぶことができるタスクのようなスプールを作成し、特定のスレッドにタスクを追加するか、これらのサービスをスプールすることです。これをクラスに配置するか外部に配置して、クラス自体に新しいタスクのためにスプールを呼び出しさせ、スプールを追跡させるべきかがわかりません。ここでは特に、空のスプールがタスクを取得した場合にクラスに通知する方法を検討しています(リスナーのアプローチなので、新しいものが到着した場合にタスクを目覚めさせたい場合は、タスクがプールにサブスクライブできます)。タスクの数と次のタスクはスケジュールされていません」アプローチ
これを作成するための良い戦略は何でしょうか。実際のクラスで作成する必要がありますか、それとも外部で作成する必要がありますか?「ビジーウェイトチェック」では、新しいジョブの追加と実際のスプールでのジョブの削除のみが可能であり、シグナリングではジョブの追加と削除の両方が必要になるだけでなく、スリープ状態になるため、実装の重要な領域は何ですか。シグナリングがクリティカルになると、クリティカル領域に入った場合にどうするかというスプールの要件が突然高くなります。これにより、ブロックが発生し、他のブロックが発生し、予期しないデッドロックが発生する可能性があります。
c - どのような状況で、Windows クリティカル セクションのロック カウントがマイナスになる可能性がありますか?
Windows の RTL_CRITICAL_SECTION 構造体の LockCount フィールドが正当に負になる状況はありますか?
非常にとらえどころのないクラッシュを追跡しており、1 つの症状として、LockCount が負の CS が見られます。墜落時のカウントは-6ですが、日常的には-1、-2などのようです。
これが非常に悪いことであると仮定して、その後を追い払う前に、その仮定が正しいことを確認したいだけです. RTL_CRITICAL_SECTION の内部動作に関する情報はほとんど、またはまったく見つかりません。
synchronization - 同期メカニズムとしてのクリティカル領域とモニターの重要性
私は多くの教科書で、クリティカルリージョンとモニターが同期メカニズムを提供する高級言語メカニズムであることを読みました。
これらについての簡単な説明はどのテキストにも見つかりませんでした。これらについては疑問があります。
コンパイラは実際にこれらをどのように実装しますか?
これらがC、Java、Pythonで利用できるかどうか。。?
モニターとクリティカル領域(条件付きクリティカル領域)での条件付き構成の重要性は何ですか
c++ - このコードは機能するクリティカルセクションラッパークラスですか
実際に2つの質問があります。最初の質問です。
2つの異なるサイトで見つけたコードを使用して、これら2つのクリティカルセクションラッパークラスを作成しました。
それはうまくいくでしょうか?
そして2番目の質問。ここを閲覧していると、作者が含まれていないことに気づきました
::初期化、削除、入力、クリティカルセクションを残す。クラスが正しく機能するためにこれらは必要ではありませんか?それとも私は何かが足りないのですか?
c++ - C++クリティカルセクションが機能しない
私のクリティカルセクションコードは機能しません!!! Backgrounder.runはMESSAGE_QUEUEg_msgQueueを変更でき、LockSectionsデストラクタはまだ呼び出されていません!!!
追加コード:
openmp - OpenMPのアトミックとクリティカルの違いは何ですか?
OpenMPのアトミックとクリティカルの違いは何ですか?
私がすることができます
しかし、これはと同じではありません
?
multithreading - Delphiスレッド:メソッド内でSynchronizeを使用すると、CriticalSectionが「リリース」されない
私のプロジェクトには、スレッド自体、他のスレッド、またはVCL(メインアプリ)によって変更される可能性のあるスレッドがあります。したがって、私はすべてのデータアクセスにTCriticalSection.Acquire/Releaseを使用しています。
通常の状況では、次のコードは期待どおりに機能します。Acquireに入り、DoCallbackと同期してから、ロックを解除します。ただし、他のコンテキストのいずれかがすでにロックされているときにロックを取得した場合、以下のコードの実行はSynchronizeで停止します。今回は、DoCallbackメソッドに入りません。
Synchronizeメソッドをスキップして(SynchronizeのコードがVCLを呼び出す場合でも)、CriticalSection自体に依存する必要がありますか?この動作の理由は何ですか?
メインスレッドのコード: