問題タブ [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 - オフセットを使用せずにポインタを共有メモリに格納することは可能ですか?
共有メモリを使用する場合、各プロセスは、共有領域をそれぞれのアドレス空間の異なる領域にマップすることがあります。これは、共有領域内にポインタを格納する場合、共有領域の開始位置のオフセットとして格納する必要があることを意味します。残念ながら、これはアトミック命令の使用を複雑にします (例えば、ロックフリーのアルゴリズムを書こうとしている場合))。たとえば、単一のライターによって作成された、共有メモリ内に多数の参照カウント ノードがあるとします。ライターは、正の参照カウントを持つ有効なノードを指すように、ポインター 'p' を定期的にアトミックに更新します。リーダーは、最初の要素が参照カウントであるノード (構造体) の先頭を指しているため、「p」にアトミックに書き込みたいと考えています。p は常に有効なノードを指しているため、ref カウントのインクリメントは安全であり、'p' の逆参照や他のメンバーへのアクセスを安全に行うことができます。ただし、これはすべて、すべてが同じアドレス空間にある場合にのみ機能します。ノードと「p」ポインタが共有メモリに格納されている場合、クライアントは競合状態になります。
- x = p を読む
- y = x + オフセット
- y で refcount をインクリメントする
ステップ 2 で、p が変更され、x が有効なノードを指しなくなる場合があります。私が考えることができる唯一の回避策は、オフセットではなく実際のポインターを mmap された領域に格納できるように、すべてのプロセスが共有メモリをマップする場所に同意するよう強制することです。それを行う方法はありますか?mmap のドキュメントに MAP_FIXED がありますが、安全なアドレスを選択する方法がわかりません。
編集: x86 でインライン アセンブリと 'lock' プレフィックスを使用すると、「値 Z によるオフセット Y で ptr X をインクリメントする」ことは可能でしょうか? 他のアーキテクチャの同等のオプション? 多くのアセンブリを書いていません。必要な指示が存在するかどうかわかりません。
c# - c# でスレッドからウィンドウをサブクラス化する
ウィンドウを探すスレッドを作成しています。ウィンドウが見つかると、windowproc をオーバーライドし、WM_COMMAND と WM_CLOSE を処理します。
ウィンドウを探してサブクラス化するコードは次のとおりです。
そしてwindowproc:
これはすべて、通常の条件下ではうまく機能します。しかし、悪い動作の 2 つのインスタンスが、悪い順に見られます。
1 分ほどでダイアログを閉じないと、アプリがクラッシュします。これは、スレッドがガベージ コレクションを取得しているためですか? スレッドが完了したことを GC が判断できる限り、これは理にかなっていますか? これが事実である場合 (そして、私はそうであるとは知りません)、ダイアログが存在する限りスレッドを存続させるにはどうすればよいですか?
「X」ボタン (WM_CLOSE) でダイアログをすぐに閉じると、アプリがクラッシュします。windowprocでクラッシュすると思いますが、そこにブレークポイントを取得できません。AccessViolationException が発生しました。この例外には、「保護されたメモリを読み書きしようとしました。これは、多くの場合、他のメモリが破損していることを示しています。」それは競合状態ですが、私にはわかりません。参考までに、コマンドを処理したら古いwindowprocをリセットしていましたが、それはさらに頻繁にクラッシュしていました!
これらの問題をどのように解決できるかについてのアイデアはありますか?
iphone - NSNotificationの競合状態
シングルスレッド内でNSNotificationsを使用する場合、競合状態の問題はありますか?サンプルメソッドは次のとおりです。
}
条件の後の最初の2つの呼び出しは、mainPaneによって受信されるNSNotificationsをトリガーします。mainPaneは、これらの通知の後にplayerToggledメッセージを受信することが保証されていますか?このコードは希望どおりに機能しているようです(playerToggledは常に最後に実行されます)。しかし、通知の周りにどのようなタイミングの問題があるのかわかりません。具体的な答えを見つけることができません。
.net-4.0 - この Entity Framework コードでこのオプティミスティック コンカレンシー エラーを処理するにはどうすればよいですか?
EF4を使用するいくつかのリポジトリ パターンプロジェクトに、次の疑似コードがあります。
非常に単純ですが、実行時エラーが発生します:-
ConcurrencyException: Store、Update、Insert、または Delete ステートメントが予期しない数の行 (0) に影響を与えました。
今、これが起こっていることです:-
- EF4 の 2 つのインスタンスがアプリで同時に実行されています。
- インスタンス A が delete を呼び出します。
- インスタンス B は、1 ナノ秒後に削除を呼び出します。
- インスタンス A がエンティティをロードします。
- インスタンス B もエンティティをロードします。
- インスタンス A はそのエンティティを削除します - クールなバナナ。
- インスタンス B はエンティティを削除しようとしますが、エンティティは既に削除されています。そのため、ノーカウントまたはそうでないものは0であり、1..またはそのようなものを期待していました。基本的に、削除するはずのアイテムが削除されていないことがわかりました (ほんの数秒前に発生したため)。
これが競合状態か何かのようなものかどうかはわかりません。
とにかく、2番目の呼び出しがクラッシュしないように、ここでできるトリックはありますか? 私はそれをストアドプロシージャにすることができました..しかし、今はそれを避けたいと思っています。
何か案は?選択が呼び出されたときにその行(およびその行のみ)をロックできるかどうか疑問に思っています...行ロックが解除されるまでインスタンスBを強制的に待機させます。その時までに、行は削除されるため、インスタンス B が選択を行うと、データは存在しません..削除されることはありません。
c# - このセマフォをモニターに置き換えるにはどうすればよいですか?
私の以前の質問で、モニターを使用する場合と比較して、C# ではセマフォを使用する方がコストがかかると誰かが言っていた。このコードのセマフォをモニターに置き換えるにはどうすればよいですか?
(別のスレッドで) function2 が完了した後に function1 がその値を返す必要があります。Semaphore.WaitOne
をaMonitor.Wait
に、Semaphore.Release
をaに置き換えましたMonitor.PulseAll
が、プログラムがハングするPulseAll
前にトリガーされていました。Wait
その競合状態を回避する方法はありますか?
php - PHPでクリティカルセクションを保護するには?
このトピックについていくつか検索しましたが、価値のあるものは何も見つかりませんでした。
PHP のデフォルト セッション ハンドラを使用しない場合、リクエスト レベルでのセッション ロックはありません。だから、私は自分で重要なセクションを保護する必要があります。
Java では、同期しました。C# にはlockがあります。
PHPでは、それを行う方法は?
c# - このMonitor.Wait/Pulseの使用には競合状態がありますか?
私は単純な生産者/消費者シナリオを持っており、生産/消費されているアイテムは1つだけです。また、プロデューサーはワーカースレッドが終了するのを待ってから続行します。この種のマルチスレッド化のポイント全体が不要になることは理解していますが、実際にはこのようにする必要があると想定してください(:
このコードはコンパイルされませんが、次のようなアイデアが得られることを願っています。
これが私がよくわからない状況です:
多くのスレッドが異なる入力でSetData()を呼び出すと仮定します。そのうちの1つだけがロック内に入り、残りはラインAでブロックされます。ロック内に入ったものがm_dataを設定し、ラインCに到達するとします。
質問:行CのWait()は、行Aの別のスレッドがロックを取得し、ワーカースレッドがそれに到達する前にm_dataを上書きできるようにすることができますか?
それが起こらず、ワーカースレッドが元のm_dataを処理し、最終的にラインFに到達すると仮定すると、そのPulse()がオフになるとどうなりますか?
ラインCで待機しているスレッドのみがロックを取得できますか?それとも、ラインAで待機している他のすべてのスレッドとも競合しますか?
基本的に、Pulse()/ Wait()が特別に「内部」で相互に通信するのか、それともlock()と同じレベルにあるのかを知りたいです。
もちろん、これらの問題の解決策は明らかです。SetData()を別のロック(たとえば、lock(y)で囲むだけです)。そもそも問題なのか気になります。
c# - MSDN TPLからの例外の処理例-これは競合状態ですか?
MSDN@のTPL例外処理の例を見ています。
http://msdn.microsoft.com/en-us/library/dd537614(v=VS.100).aspx
コードの基本的な形式は次のとおりです。
私の質問は:これは競合状態ですか?tryが実行される前にtask1がスローされた場合はどうなりますか?これがレースになるのを止める何かが欠けていますか?
代わりに次のように書くべきではありません:
multithreading - マルチスレッド読み取りでの競合状態はどうですか?
IBM.comの記事によると、「競合状態とは、2 つ以上のスレッドまたはプロセスが共有データの読み取りまたは書き込みを行っている状況であり、最終的な結果は、スレッドがどのようにスケジュールされているかのタイミングによって異なります。競合状態は、予測不能な結果や微妙なプログラムのバグにつながる」. この記事は Java に関するものですが、私は一般的に同じ定義を教えられてきました。
私の知る限り、RAM からの読み取りの単純な操作は、特定の入力ライン (アドレス、読み取りなど) の状態を設定し、出力ラインの状態を読み取ることで構成されます。これは明らかに 2 つのデバイスで同時に実行することはできず、シリアル化する必要がある操作です。
ここで、いくつかのスレッドがメモリ内のオブジェクトにアクセスする状況があるとします。理論的には、競合状態を防ぐために、このアクセスはシリアル化する必要があります。ただし、たとえば、リーダー/ライター アルゴリズムでは、任意の数のリーダーが同時に共有メモリを使用できると想定しています。
ですから、問題は次のとおりです。マルチスレッド (WinAPI など) を使用する場合、読み取り用の排他ロックを実装する必要がありますか? そうでない場合、なぜですか?このコントロールはどこに実装されていますか? OS、ハードウェア?
よろしく、クバ
c++ - C++ でロックを使用せずに競合状態を防ぐにはどうすればよいですか?
C++ でミューテックス/セマフォをロックまたは使用せずに競合状態を回避するにはどうすればよいですか? 配列に値を設定するネストされた for ループを扱っています。
多かれ少なかれ、同時に実行されている異なるスレッドが同時に array[k] に書き込まないように、これに対処したいと考えています。これにアプローチする方法について何か提案はありますか?
編集: Linux マシンで実行していますが、Intel コンパイラも使用する必要があります。「gcc」の代わりに「icc」を使用してコードをコンパイルします。