問題タブ [race-condition]
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.
wpf - UserControlで複数のプロパティのバインディングを同期する
ある種の拡張ComboBoxであるWPFusercontrolでの醜い競合状態があります。UserControlは主に2つのバインド可能なDependencyPropertiesを定義します。1つは選択されたアイテムで、もう1つは選択されたアイテムを選択できるリストです。両方ともバインド可能であるため、コントロールは選択されたアイテムの有無にかかわらず初期化でき、両方のプロパティはバインドを介して(DataContextの変更時に)変更できます。さらに、ユーザーの操作により選択が変更される場合があります。UserControlにはComboBoxが含まれており、そのItemsSourceとSelectedItemは、UserControlのプロパティとSelectedItemのリストと同期されています。ここでの問題は、両方の値が設定された新しいDataContextを設定するときに、両方のプロパティが外部から(ほぼ同時に)変更された場合、
簡単に言うと、リストの更新中にSelectedItemを「ロック」する方法を見つける必要がありますが、更新後に受信するため、PropertyChanged-Eventsを観察するだけでは不十分であり、記憶する状態はすでに失われています。さらに、選択の変更がユーザーによって引き起こされたのか、(正しく)バインディングによって引き起こされたのか、(望ましくない)他のバインディングによって間接的に引き起こされたのかを特定できません...DependencyPropertiesのBeforePropertyChangedまたはOnPropertyChangingイベントが必要になると思います-または別の両方のプロパティの同時更新の順序を管理する方法。
どんな提案も歓迎します:)
アイテムを選択するためのリストについて話しますが、実際には、迅速な並べ替えとフィルタリングを可能にするより複雑な構造であることに注意してください。これは、ここでItemsControlを使用しない理由でもありますが、そのようには感じません。質問に関連します。
java - Java の同じオブジェクトの異なるインスタンスでのマルチスレッド
すべてのクラス バイト コードは、クラス ローダーごとに 1 回メモリにロードされることを学びました。つまり、あるスレッドが何らかのメソッドのバイト コードを実行しているときに、別のスレッドが実行されます。
1スレッド -> 1インスタンス -クラス Foo の == 問題ありません。
Xスレッド -> 1インスタンス -クラス Foo == の処理が必要 これは明らかです。
Xスレッド -> X それぞれのインスタンス -クラス Fooの == ????
メソッドで何も混乱していないことを確認する必要がありますか? メソッドがインスタンスレベルの変数を使用している場合、正しい変数を使用していると確信できますか?
アップデート:
私の質問が明確ではなかったようです。ここに数字の例があります
同期のないクラス型Fooのオブジェクトがあります!!
そのFooの 5 つのインスタンスがあり、それぞれに対して 5 つのスレッドが実行され、インスタンスレベルのパラメーターにアクセスします。たとえば、次のようになります。
このクラスには1バイト コードしかなく、このバイト コードにアクセスするこのオブジェクトには5つのインスタンスしかないため、ここに問題があるのでしょうか。行う?
ありがとう、アダム。
c# - C# でマルチスレッドの状況でキューを使用する
.NET のキューについて学習したばかりで、いくつか質問があります。
ページの HTML をダウンロードして処理するアプリケーションを構築しているとしましょう。操作方法は次のとおりです。
- メイン スレッドが URL をキューに追加する
- このキューは、他の 2 つのスレッドによって読み取られます。URL を「デキュー」し、対応する HTML をダウンロードします。
- 次に、HTML がメイン スレッドに送り返されます。
- HTML がメイン スレッドに到着すると、別のキューに配置され、別の 2 つのスレッドによって処理されます。これらのスレッドは HTML を処理します。
- 処理の結果はメインスレッドに返されます。
競合状態の可能性なしにそのようなシナリオを実装するにはどうすればよいですか?
また、上記のようにキューとスレッド間で情報を渡す最良の方法は何ですか?
サンプルコードを教えてください。
ありがとう!
multithreading - レースアラウンド条件とデッドロックの違い
プログラミング用語でのデッドロックと競合状態の違いは何ですか?
c++ - 競合状態を見つける方法
競合状態を含むコードが少しあります...一貫して発生しないため、競合状態であることがわかります。デュアルコアマシンでより頻繁に発生するようです。
私がトレースしているとき、それは決して起こりません。ただし、デッドロックになる可能性もあります。これが発生するログと発生しないログの完了段階を分析することで、このバグを単一の機能に特定することができました。ただし、関数のスコープのどこでこれが発生しているのかわかりません。トップレベルではありません。
ログステートメントまたはブレークポイントを追加すると、競合状態の場合にタイミングが変更され、これが発生しなくなります。
これが発生している場所を特定できる競合状態アナライザーを入手する以外に使用できる手法はありますか?
これは、(管理されていない種類の)C++を使用するVisualStudio9にあります。
silverlight - Silverlight で競合状態をデバッグするためのテクニック
競合状態だと思うものにぶつかりました。デバッグするにはどのようなオプションが必要ですか?
詳細: Telerik グリッドを使用する Silverlight アプリケーションがあります。ユーザーは、グリッドに接続された列チューザーを使用して列をカスタマイズできます。可能な列のリストがコードを介して作成される特定のケースでは、列チューザーを開いて閉じると、グリッド内のデータ (すべての行) が消えます!
競合状態であると思われる症状: - columnchooser.close 行にブレーク ポイントを配置し、ブレーク ポイントに到達したときに続行すると、バグは表示されません (すべてのグリッド行- columnchooser.close の直前のコードに Thread.Sleep(1000) を配置すると、再びバグが消えます - デバッグ中に Visual Studio の [スレッド] ウィンドウを開いたままにすると、スレッドが一時的に表示され、 columnchooser.close でブレークポイントに到達すると、[スレッド] ウィンドウに表示されなくなります。
そのため、その時点でどのスレッドが実行されているかを把握するために次のことを試みましたが、喜びはありませんでした。
- System.Diagnostics.Process は Silverlight では使用できないため、System.Diagnostics.Process.Threads を実行して、プログラムで実行されているスレッドのリストを取得することはできません。
- 「ヒット時」実行 Macros.Samples.VSDebugger.DumpStacks でブレークポイントを試しましたが、すべてのスタック トレースがどこにダンプされているのかわかりませんでした。
この問題をデバッグするために私ができることに関するヘルプやアイデアはありますか?
c++ - vtable実装を使用したc++仮想呼び出しでのマルチスレッド競合状態の疑い
vtable動的ディスパッチング実装(vtableポインターが仮想メソッドを持つオブジェクトの非表示メンバーとして格納されている)の仮想メソッド呼び出しを含む特定のC ++マルチスレッド状況で、競合状態が発生する可能性があるのではないかと疑っています。これが実際に問題であるかどうかを確認したいのですが、参照のフレームを想定できるように、boostのスレッドライブラリを指定しています。
オブジェクト「O」にboost::mutexメンバーがあり、そのコンストラクタ/デストラクタとメソッド全体がスコープロックされているとします(Monitorの同時実行パターンと同様)。スレッド「A」は、外部同期なしで(つまり、他のスレッドと同期できる「新しい」操作を囲む共有ミューテックスなしで)ヒープ上にオブジェクト「O」を構築します。ただし、「内部」がまだ存在することに注意してください。 、そのコンストラクタのスコープをロックする「監視」ミューテックス)。次に、スレッドAは、同期されたメカニズム(たとえば、同期されたリーダー/ライターキュー)を使用して、「O」インスタンス(作成したばかり)へのポインターを別のスレッド「B」に渡します(注:へのポインターのみオブジェクト自体ではなく、オブジェクトが渡されます。建設後、
スレッド「B」は、同期されたキューからオブジェクト「O」のポインタ値を読み取り、その後すぐにキューを保護しているクリティカルセクションを離れます。次に、スレッド「B」はオブジェクト「O」に対して仮想メソッド呼び出しを実行します。ここで問題が発生する可能性があると思います。
動的ディスパッチの[かなりありそうな]vtable実装での仮想メソッド呼び出しについての私の理解は、オブジェクトの非表示メンバーとして格納されているvtableポインターを取得するために、呼び出しスレッド「B」がポインターを「O」に逆参照する必要があるということです。 、およびこれはメソッド本体に入る前に発生します(当然、実行するメソッド本体は、オブジェクト自体に格納されているvtableポインターにアクセスするまで、安全かつ正確に決定されないため)。前述のステートメントがそのような実装に当てはまる可能性があると仮定すると、これは競合状態ではありませんか?
vtableポインターは、メモリの可視性を保証する操作(つまり、オブジェクト「O」のメンバー変数ミューテックスの取得)の前に、スレッド「B」によって(ヒープ内にあるオブジェクト「O」へのポインターを参照解除することによって)取得されるためです。 、それでは、「B」が、「A」がオブジェクト「O」の構造に最初に書き込んだvtableポインタ値を認識するかどうかは定かではありません。(つまり、代わりにガベージ値を認識し、未定義の動作を引き起こす可能性がありますよね?)。
上記が有効な可能性である場合、これは、スレッド間で共有される排他的に内部同期されたオブジェクトで仮想メソッド呼び出しを行うことが未定義の動作であることを意味しませんか?
また、同様に、標準はvtableの実装に依存しないため、仮想呼び出しの前にvtableポインターが他のスレッドに安全に表示されることをどのように保証できますか?コンストラクター呼び出しと、少なくとも各スレッドでの最初の仮想メソッド呼び出しを外部で同期(たとえば、「共有ミューテックスlock()/ unlock()ブロックで囲む」のように「外部」)できると思います。しかし、これはひどく不調和なプログラミングのようです。
したがって、私の疑いが真実である場合、おそらくより洗練された解決策は、メンバーのミューテックスをロックし、その後仮想呼び出しに転送するインラインの非仮想メンバー関数を使用することです。しかし、それでも、コンストラクターがコンストラクター本体自体を保護するlock()とunlock()の範囲内でvtableポインターを初期化することを保証できますか?
誰かが私がこれを片付けて私の疑いを確認/否定するのを手伝ってくれるなら、私は非常に感謝するでしょう。
編集:上記を示すコード
--ポイント(4)で、「スレッドA」がメモリに書き込んだvtableポインタ値が「スレッドB」に表示されない可能性があるという印象を受けています。これは、コンパイラがvtableポインターがコンストラクターのロックされたmutexブロック内に書き込まれるようにコードを生成します。
たとえば、各コアに専用のキャッシュがあるマルチコアシステムの状況を考えてみます。この記事によると、キャッシュは一般的に積極的に最適化されており、キャッシュコヒーレンスを強制しているにもかかわらず、同期プリミティブが含まれていない場合は、キャッシュコヒーレンスに厳密な順序付けを強制しません。
おそらく私は記事の意味を誤解していますが、それは構築されたオブジェクトへのvtableポインターの「A」の書き込み(そしてこの書き込みがコンストラクターのロックされたミューテックスブロック内で発生するという兆候がない)を意味するのではありません「B」がvtableポインターを読み取る前に、「B」によって認識されませんか?AとBの両方が異なるコア(core0の「A」とcore1の「B」)で実行される場合、キャッシュコヒーレンスメカニズムは、core1のキャッシュ内のvtableポインター値の更新(一貫性を保つ更新)を並べ替えることがあります。 「A」が書き込んだcore0のキャッシュ内のvtableポインターの値を使用して、「B」の読み取り後に発生するようにします...記事を正しく解釈している場合。
javascript - JqueryAjaxイメージのロードはFFでのみ機能します。「競合状態」が疑われます。
jquery、ajax、jsonを使用して画像を読み込むウェブアプリを作成しました。Firefoxで動作するようになりましたが、残念ながら、SafariとChromeは頑固なままです。
これは、画像が十分に速く読み込まれない「競合状態」と関係があるため、読み込みイベントと、すべての画像が読み込まれるまで待機してからhtmlをコンテナdivに追加するトリガーイベントがあります。
FFで機能するページへのリンクは次のとおりです:http: //chereecheree.com/dagworthy/style.html
そして、いくつかのコード:var aSectionImages = new Array;
}しかし、使用されているプラグインがあるので、オンラインで見るのがおそらく最善です。とにかく、コンテナdivの計算されたスタイルが「0px」で表示されることがあります。そのため、強制的に「1000px」にしますが、そのハックはあまり安定していません。
任意のアイデアをいただければ幸いです。ありがとう!-ダニエル。
html - onmessageハンドラーを設定するときのWebワーカーとの競合状態?
次のコードと、このMozillaチュートリアル「Webワーカーの使用」の説明を考慮してください。
この例の1行目は、ワーカースレッドを作成して実行を開始します。 2行目では、ワーカーのonmessageハンドラーを、ワーカーが独自のpostMessage()関数を呼び出すときに呼び出される関数に設定しています。
スレッドは、 Workerコンストラクターが呼び出された瞬間に開始されます。onmessageハンドラーの設定に競合状態があるのではないかと思います。たとえば、onmessageが設定される前にWebワーカーがメッセージを投稿した場合です。
誰かがこれについてもっと知っていますか?
アップデート:
Andreyは、MozillaチュートリアルのFibonacciの例のように、Webワーカーがメッセージを受信したときに作業を開始する必要があると指摘しました。しかし、それはWebワーカーでonmessageハンドラーを設定する際の新しい競合状態を作成しませんか?
例えば:
メインスクリプト:
Webワーカースクリプト('worker.js')
次に、次の実行パスを検討します。
" var result = [] "行は省略できますが、それでも同じ効果があります。
これは有効な実行パスです。Webワーカーでタイムアウトを設定して試してみました。現時点では、競合状態に陥ることなくWebワーカーを使用する方法がわかりません。
javascript - AJAX GET 競合状態?
次のような方法で、自分のサイトでリンクがクリックされたときのイベントを追跡しようとしています。
私が抱えている問題は、新しいページの読み込みによって AJAX リクエストが中断されるため、これらのイベントが追跡されないことがあります。ただし、 Google アナリティクスには onclick イベントにアタッチできる機能があることは知ってい_trackPageview
ますが、これは問題ではないようです。私がこの競合状態を見ているのと私の呼び出しの何が違うのか疑問に思っていますが、GA はそうではありません。例えば:
AJAX リクエストの結果については心配していないことに注意してください...イベントが発生したという事実をサーバーに ping したいだけです。
(また、クライアント側ではなく、サーバー側から新しいページの読み込みを単純に追跡するという回答が少なくとも 1 つ得られることを期待しています。これは、この質問に対して受け入れられる回答ではありません。 Google アナリティクスのtrackPageview
機能は、新しいページが読み込まれているかどうかに関係なく、アンカー タグのクリック イベントで機能します。)