問題タブ [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.
windows - PostMessage でメッセージが失われることがある
マルチスレッド Windows アプリケーションを作成しました。ここで、スレッド:
A – ユーザーの操作を処理し、B からのデータを処理する Windows フォームです
。B – 時々データを生成し、2 つの A に渡します。
スレッド セーフ キューは、スレッド B から A にデータを渡すために使用されます。エンキューおよびデキュー機能は、Windows クリティカル セクション オブジェクトを使用して保護されます。
エンキュー関数が呼び出されたときにキューが空の場合、関数は PostMessage を使用して、キューにデータがあることを A に伝えます。この関数は、PostMessage への呼び出しが正常に実行されていることを確認し、成功していない場合は PostMessage を繰り返し呼び出します (PostMessage はまだ失敗していません)。
これは、ある特定のコンピューターが時折メッセージを失い始めるまで、かなり長い間うまくいきました。失うとは、PostMessage が B で正常に返されるが、A がメッセージを受信しないことを意味します。これにより、ソフトウェアがフリーズしたように見えます。
私はすでにいくつかの許容できる回避策を考え出しました。Windows がこれらのメッセージを失っている理由と、これが 1 台のコンピューターでのみ発生している理由を知るのは興味深いことです。
コードの関連部分を次に示します。
c# - 非一方向メソッドを使用したWCFの競合状態
私はクライアントサーバーチャットアプリケーションを設計しています(実際はそうではありませんが、私がそうであるふりをしましょう:))、そして私は私が経験したいくつかの競合状態に少し戸惑っています。
次のコードがあるとしましょう。
そして、ここにバインディング構成の抜粋があります:
これはもちろん、ある種の疑似c#です。わかりやすくするために、関連性のないコードをたくさん削除しました。
要点:このコードは機能しません。BroadcastMessageを呼び出すと、メソッドが返されることはなく、最終的にクライアント側でタイムアウトが発生します。サーバー側でデバッグすると、すべてが正常に見えます(BroadcastMessageメソッドから期待どおりに戻り、ReceiveMessageの片道呼び出しをブロックしていません)
このコードを修正する2つの方法があります:
- FaultContractを削除し、BroadcastMessageメソッドをoneway=trueとして宣言します
- メッセージを全員にブロードキャストしますが、最初の送信者
私の最初の推測では、クライアント側はサーバーが戻るのを待っていたため、サーバーからの着信ReceiveMessage呼び出しを処理できなかったため、サーバーがブロックされましたが、ReceiveMessageは一方向として宣言され、サーバーをデバッグすると次のようになります。 ReceiveMessageへの呼び出しをブロックしません
さて、私の質問:
どうしたの?
これを修正する他の方法はありますか?(おそらくバインディング構成を調整することによって?)
修正2を選択したとしましょう(つまり、送信者にブロードキャストしないでください)。自分のBroadcastMessage呼び出しが終了するのを待っている間に、サーバーがReceiveMessageコールバックを呼び出した場合(他の誰かが私にメッセージを送信したため)はどうなりますか?
OneWay呼び出しは完全に一方向ではなく、サーバーはまだ反対側からのHTTP応答を待機していることを読みました。これについての詳細はありますか?具体的には、クライアントは、遠隔通話でブロックされたときに、そのようなhttp応答に応答できますか?
編集:サーバー側でConsole .net 3.5、クライアント側でWinforms .net 3.5
java - マルチスレッド(Javaまたは.Net)プログラムでは、変数のコピーはアトミックであると想定できますか?
この質問について疑問に思っていたとき、私が設計しているアプリケーションの競合状態について心配していました。
プログラムの1つのコンポーネントによって管理される、ある種の大きな配列またはコレクションがあるとしましょう。そのコンポーネントをMonitorと呼びましょう。その仕事は、コレクションが「ダーティ」であるかどうか、つまり最近変更されたかどうかを定期的にチェックし、変更された場合は、スナップショットをディスクに書き込み(これは、クラッシュが発生した場合にアプリケーションをチェックポイントすることです)、再度クリーンとしてマークすることです。
別のスレッドで実行されている同じプログラムの他のコンポーネントは、モニターのメソッドを呼び出して、配列/コレクションにデータを追加したり、データを変更したりします。これらのメソッドは、コレクションをダーティとしてマークします。
さて、変更メソッドは他のコンポーネントのスレッドで実行されますよね?そして、運が悪ければ、スナップショットがディスクに書き込まれているときに呼び出され、すでに書き込まれているデータを変更し、ダーティフラグを設定すると、その直後にモニターのスレッドが変更を保存せずに設定を解除する可能性があります(それが変更されたとき、すでに要素を過ぎていました)。だから私はきれいとしてマークされている汚れたコレクションを持っています。
しばらくの間、コレクションの一時的なコピーを作成し、それをクリーンにマークしてから、コピーをシリアル化することで問題を解決できるのではないかと思いました。しかし、コピーはアトミックでしょうか。つまり、コピー中にコレクションが変更されないことを確認できますか?
その間、私は次のようなより良い解決策を見つけたと思います
- ディスクへの書き込みを開始する前にロックフラグを設定し、フラグが設定解除されるまでデータ変更メソッドを待機させます
- データ変更メソッドをコレクションに直接ではなく「変更キュー」に書き込み、そのキューのディスク書き込みプロセスを実行するスレッドを使用する
そして、ロックフラグが最善の方法かもしれないと思います。しかし、私はまだ興味があります:可変アトミックをコピーしていますか?
フォローアップ:これはそれ自体の問題になるかもしれませんが、実際にはほとんど同じです。以下の回答によると、私の「ロックフラグ」アプローチも機能しない可能性がありますよね?データ変更メソッドは、「ロックされた」値に設定されているときにロックフラグをチェックし、ロックされていないと判断する可能性があるためです。ですから、本当にこれを正しく行いたいのであれば、ミューテックスのような特別な構造が必要ですよね?
私のフォローアップで彼の非常に有益な答えをくれたエリクソンに称賛を送ります。私は本当にこの2つの質問をするべきだったので、2つの答えを受け入れることができたはずです。彼も投票してください。
asp.net - ASP.NET/静的クラスの競合状態?
動的コンテンツがたくさんあるASP.NETアプリケーションがあります。内容は、特定のクライアントに属するすべてのユーザーで同じです。リクエストごとに必要なデータベースヒットの数を減らすために、クライアントレベルのデータをキャッシュすることにしました。データを保持する静的クラス( "ClientCache")を作成しました。
このクラスで最もよく使用されるメソッドは「GetClientData」です。これは、特定のクライアントに保存されているすべてのデータを含むClientDataオブジェクトを返します。ただし、ClientDataは遅延してロードされます。要求されたクライアントデータがすでにキャッシュされている場合、呼び出し元はキャッシュされたデータを取得します。それ以外の場合は、データがフェッチされ、キャッシュに追加されてから、呼び出し元に返されます。
最終的に、ClientDataオブジェクトがキャッシュに追加された行のGetClientDataメソッドで断続的なクラッシュが発生し始めました。メソッド本体は次のとおりです。
例外テキストは常に「同じキーを持つオブジェクトがすでに存在します」のようなものです。もちろん、クライアントがすでに存在する場合は、クライアントをキャッシュに追加できないようにコードを記述しようとしました。
この時点で、競合状態が発生し、メソッドが2回同時に実行されている可能性があります。これにより、コードがどのようにクラッシュするかを説明できます。しかし、私が混乱しているのは、メソッドを2回同時に実行する方法です。私の知る限り、ASP.NETアプリケーションは一度に1つの要求しか処理しません(そのため、HttpContext.Currentを使用できます)。
それで、このバグは、クリティカルセクションにロックをかける必要がある競合状態である可能性がありますか?それとも私はもっと明白なバグを見逃していますか?
javascript - IE8 -- JS の非同期検証?
そのため、ie8 で jquery とさまざまな JavaScript ファイルを使用すると、いくつかの奇妙な問題が発生します。これらのエラーは、Firefox、Safari、または以前のバージョンの IE では発生していません。発生している主なものは、変数の未定義、ブラケットの不一致エラーなどですが、ページを強制的に更新するたびにエラーが変化します。引用されたファイルをチェックすると、そのような構文エラーは明らかになりません。
私の質問は、まず、他の誰かがそのようなエラーを見たことがありますか? 非同期イベントの問題に似ているようです。これは、IE8 の新しいマルチプロセス/マルチスレッド ブラウジング機能と関係がありますか? IE 8 は、js ファイルがダウンロードされた直後に何らかの検証を実行しますか?
前もって感謝します。
更新: 受信した js ファイルの要素をより大きな js ファイルにシャッフルしているようです。デバッガーでは、あるファイルのメソッドが別のファイルのコードの途中に表示されています。「インポートされた」セグメントが依存するコードが見つかりません。ここで何が起こっているのかわかりません....
mysql - MySQL 競合状態
これにより、MySQL (InnoDB) との競合状態が発生しますか?
取引開始。
レコードを取得してみてください。
レコードが存在しない場合は、戻ります。
レコードが存在する場合は、それを削除し、削除されたことを示すログ エントリを追加します。
トランザクションの終了 (コミット/ロールバック)。
2b の削除ステップの直前に別のプロセスを開始し、レコードの存在を検出してから、両方のプロセスに項目削除エントリをログに入力させることは可能ですか?
私が取る必要がある予防措置はありますか?
ありがとう。
iphone - NSURLConnection に関する Apple SDK ドキュメントの間違いまたは混乱?
最近、Apple SDK (iPhone など用) を学習していて、理解できないことに遭遇しました。http://developer.apple.com/documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.htmlの「NSURLConnection の使用」のドキュメント
奇妙な説明とサンプル コードを見つけました。まず、次のように述べています。
ダウンロードは、initWithRequest:delegate: メッセージを受信するとすぐに開始されます。デリゲートが connectionDidFinishLoading: または connection:didFailWithError: メッセージを受信する前に、接続にキャンセル メッセージを送信することにより、いつでもキャンセルできます。
次に、次のコードを示します。
そのため、接続が初期化されるとすぐに、別のスレッドでダウンロードをすぐに開始する必要があるように思えます。これは明らかです。なぜなら、このコードは非ブロッキングであり、メッセージをデリゲート (この場合は self) に送り返すからです。それでも、(autorelease スタイルの) receivedData の割り当ては、他のスレッドが開始された後に発生します。これは危険な競合状態ではありませんか? これは、サーバーの応答が非常に高速な場合 (ループバック デバイスなど)、または不運なスレッド スケジューリングの場合に、クラッシュ、メモリ リーク、またはデータの損失を引き起こす可能性はありませんか? theConnection が初期化される前に receivedData を割り当ててから、上記の else の場合にそれを解放する方が理にかなっているでしょうか?
私はこのコードにとても混乱しています。誰かが私のためにいくつかの光を当ててくれることを願っています. 情報をありがとう、
ルディ・チリブラシ
mysql - MySQL: 競合状態を防ぐ - FOR UPDATE または LOCK IN SHARE MODE?
これが私の希望する取引注文です:
- User1 はフィールドを選択し、操作を実行し、新しい値で更新します。
- User2 はフィールドを選択し、操作を実行し、新しい値で更新します。
- User3 はフィールドを選択し、操作を実行し、新しい値で更新します。
私が理解していることから、最初の選択は書き込みロックのみを実行し、2番目の選択は読み取りおよび書き込みロックを実行します。
どちらも使えるように見えますが、最初のケースでは、User2 はどのような値を読み取りますか? User1 が更新される前の初期値、または User1 が更新された後の値 (どちらが必要ですか)?
だから私は混乱しています.SELECT ... FOR UPDATEまたはSELECT ... LOCK IN SHARE MODEを使用する必要がありますか?
parallel-processing - ひどいパフォーマンス - 単純なオーバーヘッドの問題ですか、それともプログラムの欠陥ですか?
ここには、比較的単純な OpenMP コンストラクトであると私が理解しているものがあります。問題は、2 つのスレッドと比較して、1 つのスレッドでプログラムが約 100 ~ 300 倍高速に実行されることです。プログラムの 87% が で費やされgomp_send_wait()
、さらに 9.5% が で費やされgomp_send_post
ます。
プログラムは正しい結果を返しますが、リソースの競合を引き起こしているコードに欠陥があるのか 、それともチャンクサイズ4のループではスレッド作成のオーバーヘッドが大幅に価値がないだけなのか疑問に思います p
。シミュレートしている分子のサイズに応じて、17 から 1000 までです。
私の数値は、p が 17 でチャンク サイズが 4 の場合の最悪の場合のものです。パフォーマンスは、静的、動的、またはガイド付きスケジューリングのいずれを使用しても同じです。p=150
と チャンク サイズを使用75
しても、プログラムはシリアルよりも 75 倍から 100 倍遅くなります。