問題タブ [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.
multithreading - Nibernate、マルチスレッド、および競合状態
NHibernate を使用してデータベースに非同期で保存するときに、競合状態の問題が発生しています。最初にデータベースへの挿入が非同期で行われ、一意の ID が自動生成されます。この挿入がメイン スレッドに戻る前に、データベースで生成された一意の ID を持つ現在永続化されたオブジェクトを使用して、オブジェクトが何らかの方法で更新されます。更新するオブジェクトにはまだ ID 値がないため、session.Update を呼び出すと更新が失敗します。SaveOrUpdate を呼び出すと、エンティティの id フィールドが unsaved-value プロパティと等しいため、明らかに Update ではなく挿入になります。このコードで状況がより明確になることを願っています。
1 つの解決策は、保存する前にコードで一意の ID を生成することです。この場合、データベースではなく、アプリケーションが一意の ID の増分を管理します。これを処理する他の方法はありますか?
c++ - 仮想関数とpthread_createの間の競合
仮想メソッドを使用してクラスインスタンスを作成し、それをpthread_createに渡そうとすると、競合状態が発生し、呼び出し元が派生メソッドではなく基本メソッドを呼び出すことがあります。グーグルpthread vtable race
した後、これはかなりよく知られている動作であることがわかりました。私の質問は、それを回避するための良い方法は何ですか?
以下のコードは、どの最適化設定でもこの動作を示しています。MyThreadオブジェクトは、pthread_createに渡される前に完全に構築されていることに注意してください。
flash - AS3 での競合状態発火イベント
正しい年代記の順序でイベントを起動および削除するのに問題があります。以下のコードは、次の出力を提供します。
- ポスターをデータベースに保存し、イベントをディスパッチする
- サービスの呼び出し、ディスパッチ イベントの削除 = false
- サービスの呼び出し、ディスパッチ イベントの削除 = false
- サービスの呼び出し、ディスパッチ イベントの削除 = true
- ポスターをデータベースに保存し、イベントをディスパッチする
- ポスターをデータベースに保存し、イベントをディスパッチする
もちろん、これは次のようになります。
- ポスターをデータベースに保存し、イベントをディスパッチする
- サービスの呼び出し、ディスパッチ イベントの削除 = true
- ポスターをデータベースに保存し、イベントをディスパッチする
- サービスの呼び出し、ディスパッチ イベントの削除 = true
- ポスターをデータベースに保存し、イベントをディスパッチする
- サービスの呼び出し、ディスパッチ イベントの削除 = true
誰かがこれで私を助けることができますか? これに取り組む方法についてのアイデアが不足しています。
どうも!
javascript - Javascript スレッドの競合状態
編集: ここに投稿した元の YUI3 の質問に対する答えを見つけましたが、別の質問につながったので、新しいスレッドを開始する代わりに、ここに追加するだけだと思いました。下にスクロールして新しい質問を見つけてください (太字になっています)。
元の質問: YUI 定義内で JavaScript カウントダウン タイマーを作成する際に問題が発生しています。私の推測では、オブジェクトのスコープに関係しています。これが私のコードです:
私が得ているエラーは、呼び出しを要求しているように 1000 ミリ秒待たず、timer_trigger()
最終的に Safari がコードの実行を停止するかどうかを尋ねてくることです。ページを読み込んでから数秒すると、タイマーはすでに約 3、4 分になっています。も使用してみましsetTimeout
たが、同じ結果が得られます。誰でも助けることができますか?とても感謝しております!
編集:私は実際に解決策を見つけました-これは何時間も試行錯誤した結果ですが、さらにいくつかのGoogle検索で新しい結果/回答が得られる場合があります(実際、このサイトで回答を見つけました)。
どうやら私のコードが競合状態を作成していたようで、それを修正するために私がしなければならなかったのはこれだけです:
私は競合状態を調べましたが、それが私の場合に何を意味するのか、そして私のコードへの一見些細な変更が私が抱えていた問題をどのように修正したのかは不明です。元の質問は答えましたが、これを答えから生じた質問に変えたいと思います。
JavaScript のスレッド化はどのように機能し、競合状態の原因は何ですか?コードの小さな変更によってエラーが修正されたのはなぜですか?
ruby-on-rails - Ruby on Railsアプリケーションで競合状態を回避するにはどうすればよいですか?
各サブドメインに個別のデータベースがあるRailsアプリケーションを開発しています。そして、私はこのようなことをしています。
これで、production
モードでは、要求がこの順序で来て実行されます。
- リクエスト「A」はサブドメインa.example.net
MyModel
に送信され、データベース「a」との接続を確立します。 - ここで、別のリクエスト「B」がサブドメインb.example.net
MyModel
に送信され、データベース「b」との接続を確立します。 - ここで、リクエスト「A」がどのデータベースにアクセスしようとした場合、
MyModel.find_*()
どのデータベースにアクセスしますか?「a」または「b」?
これが「スレッドセーフ」または「競合状態」と呼ばれるものだと思います。そうであれば、サブドメインごとに1つのデータベースを使用してアプリケーションを実装するときに、どうすればそれを回避できますか?
上記の質問では、2つのリクエストを同時に実行することは、運用サーバーの通常の動作であると想定しています。または、より良いアプローチがありますか。本番サーバーの経験はあまりないので、アドバイスをお願いします。
python - Python サービス ファイル キャッシング Apache 競合状態
ユーザーが画像にアクセスできるpythonサービス(pyamf)を書いています。すべての画像は中央サーバーに保存されます。Python サービスは、サーバーにネットワーク アクセスできるサテライト マシンで実行されます。サービスは次のように動作する必要があります。
- ファイルが存在するかどうかをローカルで確認し、存在する場合はそれを使用します。
- ファイルが現在サーバーから転送されているかどうかをローカルで確認します (file.part が存在し、サイズが変化しています)。その場合は、ダウンロードが完了するまで待ってから、ファイルを使用してください。
- ファイルが存在せず、ファイルがダウンロードされていない場合は、urlretrieve を介してファイルをダウンロードします。
問題は、Apache の複数のスレッドにあります。スレッドは同時にファイルの存在チェックに到達しているため、すべてのスレッドがファイルをダウンロードする必要があると考えています。言うまでもなく、これは良くありません。
この競合状態を処理する正しい方法は何ですか?
ありがとう!
ruby-on-rails - RSpec 単体テストで競合状態をシミュレートする
オブジェクトに対して長時間実行される可能性のある計算を実行する非同期タスクがあります。結果はオブジェクトにキャッシュされます。複数のタスクが同じ作業を繰り返さないようにするために、アトミック SQL 更新によるロックを追加しました。
ロックは非同期タスク専用です。オブジェクト自体は、ユーザーによって更新される可能性があります。その場合、オブジェクトの古いバージョンの未完了のタスクは、古い可能性があるため、その結果を破棄する必要があります。これも、アトミック SQL 更新を使用すると非常に簡単に実行できます。
オブジェクトが更新されている場合、そのバージョンは一致しないため、結果は破棄されます。
これら 2 つのアトミックな更新は、考えられる競合状態を処理する必要があります。問題は、単体テストでそれを確認する方法です。
最初のセマフォは、(1) オブジェクトがロックされている場合と (2) オブジェクトがロックされていない場合の 2 つのシナリオで 2 つの異なるテストをセットアップするだけなので、簡単にテストできます。(SQL クエリの原子性をテストする必要はありません。それはデータベース ベンダーの責任です。)
2 番目のセマフォをどのようにテストしますか? オブジェクトは、最初のセマフォの後、2 番目のセマフォの前に、第三者によって変更される必要があります。これには、更新が確実かつ一貫して実行されるように実行を一時停止する必要がありますが、RSpec でブレークポイントを挿入するサポートがないことを私は知っています。これを行う方法はありますか?または、そのような競合状態をシミュレートするために見落としている他の手法はありますか?
mysql - MYSQL でロックされていない最初の行を取得する
誰かが私のウェブサイトにアクセスすると、ページビューが最も少ないページが表示されます。ページビュー カウンターを含むすべてのページは、MYSQL データベースに格納されます。ページが表示されると、ページビュー カウンターが 1 つ増加します。
Web サーバーに複数のスレッドがある場合、競合状態に陥ります。
スレッド 1: ユーザー A がページビュー カウント 10 のページ P を取得する
スレッド 2: ページビュー カウント 10 のページ P をユーザー Bが取得する
スレッド 1: ページ P のページビュー カウントが 10 から 11 に増加され、保存される
スレッド 2: ページ P のページビュー カウント10から11に増やされて保存される
そのため、最後にページは 2 回表示されましたが、ページカウンターは 1 つしか増加しません。
解決策は、SELECT ... FOR UPDATE を使用して行をロックすることですが、ユーザー B は、ユーザー A がアクセスしているレコードが保存されるまで待機する必要があり、多くのスレッドがすべてページビューが最も少ないページを取得しようとします。遅れる。
だから私の質問:いくつかの行がロックされているときに、ロックされていない最初の行を取得して、スレッドが互いに待機する必要がないようにすることは可能ですか? MYSQLでこれを行う方法は?
次の結果になるソリューションをお勧めします。
スレッド 1: ユーザー A がページ ビュー カウント 10 でページ P をロックする
スレッド 2: ユーザー B がページ ビュー カウント 11 でページ Q をロックする (ページ P がロックされているため)
スレッド 1: ページ P のページビュー カウントが 10 から 11 に増加し、保存される
スレッド2: ページ Q のページビュー数を 11 から 12 に増やして保存
c++ - Windows スレッド:いつ InterlockedExchangeAdd() を使用する必要がありますか?
この関数のネーミングは、複雑なことが起こっているようです。次のようなことをする代わりに、これが進むべき道であることを正確に知るのはいつですか:
準備 CRITICAL_SECTION cs; int *p = malloc(sizeof(int)); // 割り当てサイト InitializeCriticalSection(&cs); // 最初の書き込みのヒント
スレッド #1 { *p = 1; // 最初の書き込み }
スレッド #2 { EnterCriticalSection(&cs); *p = 2; // 2 回目の書き込み LeaveCriticalSection(&cs); }
1 つのスレッドで実行される書き込みがあります。
次に、別のスレッドで行われる読み取りがあります (同時に行われる可能性があります)。
この競合状態を解決するための最良の解決策は何ですか? クリティカル セクションを使用するか、InterlockedExchangeAdd() を使用する方が便利ですか?