問題タブ [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.
linux - シェル スクリプトの実行を同期する
シェル スクリプトの修正版は、オーディオ ファイルを FLAC から MP3 形式に変換します。コンピューターにはクアッドコア CPU が搭載されています。スクリプトは次を使用して実行されます。
これにより、ディレクトリ内の FLAC ファイル(ファイル名にスペースなし) がディレクトリ内 ( と同じレベル)flac
の MP3 ファイルに変換されます。コピー先の MP3 ファイルが既に存在する場合、スクリプトはそのファイルをスキップします。mp3
flac
問題は、スクリプトの 2 つのインスタンスが同じ MP3 ファイルの存在をほぼ同時にチェックすることがあり、その結果、MP3 ファイルが壊れることがあります。
コマンドラインごとに異なるファイルセットを指定したり、作業を上書きしたりせずに、スクリプトを複数回 (つまり、コアごとに 1 回) 実行するにはどうすればよいでしょうか?
更新 - 最小限の競合状態
このスクリプトは、次のロック メカニズムを使用します。
ただし、これでも競合状態が残ります。
jquery - jQueryリモート検証の競合状態
jQueryフォームプラグインと組み合わせて使用されるjQuery検証プラグインとリモート検証ルールに問題があります。
そのため、jQueryフォームプラグインを使用してフォームの送信をインターセプトし、検証が失敗した場合、フォームは送信されません。ただし、リモートルールがすでに検証されている(サーバーからの応答を待っている)場合は、とにかくフォームが送信されます。
フォームのその他のルールと同様に、すべてが正常に機能する前または後の場合。ただし、リモートルールのGETの途中にいる場合は、$('#myform')。validate.form()がtrueを返し、フォームが送信されます。
したがって、コードは次のようになります。
保留中のリモート検証を強制的に待機する方法はありますか?
または、検証ルールに「onsubmit:true」のみを残すことができるので、検証は送信時にのみ行われ、validate()。form()の値を返す前に完了を待つことを確認しますが、これが私の最後ですリゾート。
wordpress - WordPressデータベースから最後に挿入された行IDを取得するにはどうすればよいですか?
私のWordPressプラグインには、IDと呼ばれるAUTO_INCREMENT主キーフィールドを持つテーブルがあります。テーブルに新しい行が挿入されたら、挿入のID値を取得したいと思います。
この機能は、AJAXを使用してデータをサーバーに送信し、DBに挿入することです。新しい行IDは、クライアントのステータスを更新するためにAJAX応答で返されます。複数のクライアントが同時にサーバーにデータを投稿している可能性があります。したがって、各AJAXリクエストが応答として正確な新しい行IDを取得することを確認する必要があります。
PHPには、この機能のためにmysql_insert_idというメソッドがありますが、引数が最後の操作のlink_identifierである場合にのみ、競合状態に対して有効です。私のデータベースでの操作は$wpdbです。$ wpdbからlink_identifierを抽出して、mysql_insert_idが機能することを確認するにはどうすればよいですか?$ wpdbから最後に挿入された行のIDを取得する他の方法はありますか?
ありがとう。
python - Python でフォルダーを作成する競合状態
次のコードが原因で散発的にクラッシュする urllib2 キャッシュ モジュールがあります。
問題は、2 行目が実行されるまでに、フォルダーが存在する可能性があり、エラーが発生することです。
これは、私が制御できないサードパーティのコードによって、スクリプトが同時に何度も起動されるためです。
(バグを修正しようとする前の) コードは、こちらの github にあります。
tempfile.mkstempは使用できません。これは、キャッシュの目的を無効にするランダムな名前のディレクトリ ( tempfile.py source here ) を使用して競合状態を解決するためです。
フォルダー名がファイルとして存在する場合 (別のエラー)、同じエラー Errno 17 エラーが発生するため、単純にエラーを破棄したくありません。次に例を示します。
threading.RLock
コードが複数のプロセスから呼び出されるため、使用できません。
それで、私は単純なファイルベースのロックを書いてみました(そのバージョンはここにあります)が、これには問題があります.1レベル上のロックファイルを作成するため/tmp/example.lock
、キャッシュディレクトリとして/tmp/example/
使用すると壊れます(しようとして/tmp/
作る/tmp.lock
)。
つまり、urllib2
応答をディスクにキャッシュする必要があります。これを行うには、マルチプロセスの安全な方法で既知のディレクトリにアクセスする必要があります (必要に応じてディレクトリを作成します)。OS X、Linux、および Windows で動作する必要があります。
考え?私が考えることができる唯一の代替ソリューションは、ファイルではなく SQLite3 ストレージを使用してキャッシュ モジュールを書き直すことです。
python - ジャンゴのカウンターのアトミックインクリメント
Django で単純なカウンターをアトミックにインクリメントしようとしています。私のコードは次のようになります。
私が Django を正しく理解していれば、関数をトランザクションでラップし、インクリメントをアトミックにする必要があります。しかし、それは機能せず、カウンターの更新に競合状態があります。このコードをスレッドセーフにするにはどうすればよいですか?
multithreading - x86での単語のティアリング
2つの異なるスレッドがx86上の同じ配列の隣接する要素に同時に書き込むのは、どのような状況で安全ではありませんか?非常識なメモリモデルを備えた一部のDS9Kのようなアーキテクチャでは、これによりワードティアリングが発生する可能性があることを理解していますが、x86では1バイトでアドレス指定できます。たとえば、Dプログラミング言語real
では、x86では80ビット浮動小数点型です。次のようなことをしても安全ですか?
注:これが安全であっても、キャッシュとの誤った共有の問題が発生し、パフォーマンスが低下する可能性があることを私は知っています。ただし、私が念頭に置いているユースケースでは、書き込みは実際には問題にならないほど頻繁ではありません。
編集:書き込まれた値を読み戻すことについて心配する必要はありません。値が読み取られる前に同期が行われることが前提です。私はこのように書くことの安全性だけを気にします。
multithreading - AtomicInstructionsとVariableUpdateの可視性
最も一般的なプラットフォーム(最も重要なのはx86です。一部のプラットフォームには、マルチスレッドに役立つ保証がほとんどない非常に難しいメモリモデルがあることを理解していますが、まれな反例は気にしません)、次のコードは安全ですか?
スレッド1:
スレッド2:
アトミック操作の標準的で合理的な実装を想定すると、次のようになります。
- スレッド1の割り当ては、呼び出される
someVariable
前に完了することが保証されていますか?atomicSet()
- スレッド2は、アトミックに読み取る場合、
someVariable
呼び出す前に割り当てを確認することが保証されていますか?doMoreStuff()
stuffDoneFlag
編集:
- 私が使用しているアトミック操作の実装には
LOCK
、役立つ場合は、各操作にx86命令が含まれています。 stuffDoneFlag
なんとかして適切にクリアされたと仮定します。どのように重要ではありません。- これは非常に単純化された例です。問題のコンテキスト全体を理解して答える必要がないように、この方法で作成しました。私はそれが効率的ではないことを知っています。
c - [APUE]親と子はフォーク後に同じファイルオフセットを共有しますか?
APUEセクション8.3fork function
で、親プロセスと子プロセス間のファイル共有について、次の
ように述べています。It is important that the parent and the child share the same file offset.
また、セクション8.9Race Conditions
には、例があります。親と子の両方が、
fork関数を呼び出す前に開かれたファイルに書き込みます。プログラムには競合状態が含まれています。
これは、出力がカーネルによってプロセスが実行される順序と、各プロセスが実行される時間に依存するためです。
しかし、私のテストコードでは、出力が重複しています。
[Langzi @ Freedom apue] $ cat race.out
これは長い長い出力ですこれは、親からの長い長い出力です
親と子が同じオフセットを共有するのではなく、別々のファイルオフセットを持っているようです。
コードにエラーはありますか?それとも、オフセットを共有することの意味を誤解しましたか?
任意のアドバイスや助けをいただければ幸いです。
以下は私のコードです:
c# - 競合状態 / TextWriterTraceListener
複数のスレッドからファイルにログを記録しているときに、競合状態のように見えるものがあります。
1) アプリケーションの複数のスレッドで共有されるカスタム ロガー クラス (ConfigurableTraceLogger) があります。メインコア関数をすべて呼び出すラッパー関数がたくさんあります
ご覧のとおり、私のクラスは、TraceListner から派生したさまざまなクラスをコレクション _listeners に格納するだけです。基本的に、コンソールとテキスト ファイル リスナーのみがあります。TraceData の機能 カテゴリ名 (つまり、ログの開始) を取得し、適切なリスナーを見つけます。すべてのリスナーは構成ファイル名で定義されます
これで、コレクションにカスタム リスナーも追加されました
そのカスタム クラスは、1 つのプロパティを除いて何もオーバーライドしません。
5 ~ 10 分後にアプリケーションを開始すると、通話で例外が発生します
例外は言っています:
「メモリのコピー中に I/O 競合状態の可能性が検出されました。I/O パッケージはデフォルトではスレッド セーフではありません。マルチスレッド アプリケーションでは、TextReader によって返されるスレッド セーフ ラッパーなど、スレッド セーフな方法でストリームにアクセスする必要があります。または TextWriter の Synchronized メソッド。これは、StreamWriter や StreamReader などのクラスにも適用されます。」
その後、同じ呼び出しで2番目の例外を何度も取得し続けます
例外
カウントを 0 未満にすることはできません。パラメータ名: count スタック トレース: " at System.String.CopyTo(Int32 sourceIndex, Char[] destination, Int32 destinationIndex, Int32 count)\r\n at System.IO.StreamWriter.Write(String value)\r\n at System.IO.StreamWriter.Write(String value) System.Diagnostics.TextWriterTraceListener.Write(String message)\r\n System.Diagnostics.TraceListener.WriteHeader(String source, TraceEventType eventType, Int32 id)\r\n at System.Diagnostics.TraceListener.TraceData(TraceEventCache eventCache, String) source, TraceEventType eventType, Int32 id, Object data)\r\n at Jfc.Configuration.ConfigurableTraceLogger.TraceData(String category, TraceEventType type, EventId id, String prefix, String format, Object[] args)"
私のクラスはTraceDataへの呼び出しと同様にスレッドセーフではないようです。しかし ConfigurableTextWriterTraceListener は結局スレッドセーフと言われています。ただし、実行時に TextWriterTraceListener 派生クラスの IsThreadSafe プロパティをチェックしたところ、false でした。問題がどこにあるのかを理解しようとしています。
c# - FileSystemWatcherの優先度
C#でFileSystemWatcherを使用してイベントを作成するためにフォルダーを監視しようとしています。問題は、別のサードパーティプロセスもそのフォルダを監視していることです。サードパーティプロセスの前に、プロセスが作成イベントを受信する必要があります(可能であれば)。
管理されたコードまたは管理されていないコードで、プロセスに高い優先順位を与える方法はありますか?