問題タブ [mutual-exclusion]
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.
c# - 相互に排他的なレコードを要求する
私は2種類のアプリケーションでC#を使用しています。1つはWebサービスで、もう1つはMVC3アプリケーションです。
私は両方で同じ問題を抱えています。要求されたときに、分散ノードが機能するレコードを返すメソッドを作成しようとしています。
並行性の問題により、これは危険です。プロセス「A」が作業するレコードを要求すると。データベースがレコードの「A」をチェックアウトする前にプロセス「B」が1つを要求した場合、両方が同じレコードを取得する可能性があり、これはこのシステムに悪影響を及ぼします。
Webサービスには、「GetRecordToProcess」と呼ばれるWebメソッドがあります。同じことを行うコントローラーには、対応するMVC3ActionResultもあります。
WebサービスとMVCアクションは相互に排他的である必要はありません。彼らは実際には2つの異なるテーブルで作業していますが、2つの別々のプロジェクトで同じ問題が発生しました。
私はMutexでこれの動作バージョンを持っていますが、baaaadであるMutex.WaitOneを呼び出すと、プロセスはCPUをほぼ60%まで実行しています。これを行うための簡単な方法の提案はありますか?これは、一般的な分散コンピューティングの要件であることは明らかなようです。私は一般的な解決策を知りません。
algorithm - Peterson-2 相互排除アルゴリズム
従来のPeterson-2 アルゴリズムの競合のない複雑さは 4 です (共有レジスタ メモリに対して 4 つの読み取り/書き込み操作を実行するため)。共有レジスタ メモリへのアクセスが少なくて済む Peterson-2 アルゴリズムのバージョンはありますか 当然、1回のアクセスは無理ですが、2回や3回のアクセスはどうでしょうか。ありがとうございました
c# - lock ステートメントのように相互排除を実現するにはどうすればよいですか? ただし、ブロックがロックされている場合、ブロックはスキップされます。
lock ステートメントを使用すると、「あるスレッドがコードのクリティカル セクションに入っているときに、別のスレッドがクリティカル セクションに入らないようにすることができます。別のスレッドがロックされたコードに入ろうとすると、オブジェクトが解放されるまで待機し、ブロックします。 ."
別のスレッドがロックされたコードに入ろうとした場合に、(ロックが解放されるのを待つのではなく) コード全体をスキップするという動作が必要な場合はどうすればよいでしょうか? 私の頭に浮かぶアイデアは、次のようなフラグを使用することです
しかし、2 つのスレッドが true に設定される前に 2 つのスレッドが最初の行を通過する可能性があるか、例外が発生した場合にフラグが false に設定されないため、これは安全ではないことを私は知っています。
concurrency - 監視と相互排除
モニターの相互排除がプロシージャ/メソッド レベルなのか、それともモニター レベルなのかを知りたいだけです。
つまり、最初のケースでは、モニターにアクセスする 2 つのスレッドが存在する可能性がありますが、それらは異なる手順で実行されます。2 番目のケースでは、2 つの異なるプロシージャが呼び出されたとしても、2 つのスレッドがモニターにアクセスすることはありません。
モニターレベルであると仮定すると、はるかに安全に思えます。ただし、モニターで 2 つの異なるスレッドが実行され、それぞれが異なる共有変数を変更している可能性があり、モニターがこれを許可しないという状況はありませんか? その場合、システムの同時実行性が低下しませんか? それとも、1 つではなく 2 つのモニターを作成する必要があるということでしょうか?
わかりました、哲学を終わらせた方がいいです:) よろしくお願いします
java - メインスレッドからオブジェクトを共有し、スレッドの実行を制御する
私は非常に簡単な問題を解決しようとしています。フレームを描画するメインスレッドと、毎回このフレームを準備する別のスレッド(FrameThread)があります。両方のスレッドが同じ MyFrame オブジェクトを共有する必要があります。メイン スレッドから FrameThread を制御したい。つまり、MyFrame の準備ができている -> メイン スレッドで描画 -> FrameThread を実行し続ける 現在、私は次のことを行いました:
その後、FrameThread を作成します。
そして最後にメインスレッド:
私の目標は、FrameThread がバックグラウンドで実行され、フレームの準備ができた直後に停止することです。私はJavaの初心者であり、それを達成するためのはるかに優れた安全な方法があると感じています. それについてアドバイスをいただけますか?ありがとうございました。
email - ASP.net + C#.netでの相互に排他的なアクセス
現在、多くの作業と検索を行っても解決できない問題に直面しています。以前に同様の質問をしましたが、正しく質問しなかったためか、その質問を削除したためか、応答がありませんでした。
MailBEE.netオブジェクトライブラリを使用してメールをダウンロードしていますが、前の呼び出しがまだダウンロードフェーズにあるときにダウンロードメソッドが再度呼び出された場合、メッセージの2つのコピーがダウンロードを開始しますが、これは間違っています。
ASP.netページで、電子メールをダウンロードするASHXハンドラーを呼び出しています
別の(ASPX)ページからJqueryを使用して上記のASHXハンドラーを呼び出しています
目的は、しばらくして(20000遅延)sync.ashxを呼び出し続けて新しいメッセージを確認することです。問題は、sync.ashxの1つの呼び出しがメッセージのダウンロードでビジーであり、この間に新しい呼び出しが行われた場合に開始されます。以前の呼び出しが行う予定の電子メールのIDがデータベースに見つからないため、メッセージの同一のコピーをダウンロードします。
ある種の相互に排他的なアクセスが必要です。一度呼び出しがメッセージのダウンロードでビジー状態になった場合、別の呼び出しを行わないようにする必要があります。
何かのようなもの
IsAlreadyDownloadingはグローバルフラグまたはミューテックスであり、1つの呼び出しがダウンロードを開始するとTrueに設定し、ダウンロードが終了するか、別の呼び出しを安全に実行できることを示す例外が発生するとfalseに設定する必要があります。
これはASP.netアプリケーションであるため、ユーザーがダウンロード呼び出しを開始するページから移動するタイミングと、そのページに戻るタイミングがわからないため、ダウンロードハンドラーをもう一度呼び出す必要があるかどうかはわかりません。
きちんと説明したかどうかはわかりませんが、誰かに理解してもらいたいです。ありがとうございました。
c++ - C++11 での相互排除の処理
私は有限状態マシンを表すクラスを持っています。これは永久ループで実行され、現在の状態を確認する必要があります。各状態で、マシンは次の状態を設定し、状態に陥るかidle
、何らかの作業を行います。作業中に別のスレッドがマシンの状態を変更できるようにしたいと思います。これにより、予想どおり競合状態が発生します。そこで、マシンの相互排除ロック/ロック解除ラッピング ループと、他のスレッドがマシンの現在の状態を変更できるようにするパブリック メソッドを追加します。
実装:
そして、他のスレッドが現在の状態を変更できるようにする move メソッド:
私は自分が間違っていることを見つけることができません!関数の最初の行でプログラムがクラッシュしmove()
ます。一方、GDB は C++11 では動作せず、コードのトレースはできません...
アップデート:
コードをいじってみると、move 関数に問題があることがわかります。プログラムが 内のコード部分をロックしようとするとmove()
、クラッシュします。たとえば、 move が次のような場合:
出力は次のとおりです。
しかし、 whenmove
は単純な関数で、何もしません:
プログラムは同時に実行されます。
concurrency - 相互排除と同期の違いは?
上記の2つの違いは何ですか?
この質問が頭に浮かんだのは、
モニターとロックによる相互排除
セマフォと条件変数は同期を提供します
これは本当ですか?
また、検索中にこの記事を見つけました
明確化してください。
android - Androidライブラリプロジェクトコードが、それを統合するインストール済みアプリケーションの1つでのみ実行されるようにするにはどうすればよいですか?
私は、GooglePlayで見ることができるいくつかの人気のあるAndroidアプリケーションに統合されるライブラリプロジェクトを開発しています。
ユーザーが2つ以上のアプリケーションをインストールでき、それぞれが私のライブラリを統合できると仮定します。ライブラリには、環境の状態の変化を検出するために使用される特定のコードがあります。状態は単に私のサーバーに送信されます。問題は、環境状態の処理に多くのCPUパワーが必要ですが、短時間であるということです。処理のサイクルは、適切なIntentServiceを起動する「非ウェイクアップ」ブロードキャストを使用してAlarmManagerによって開始されます。
私の目標は、アプリケーションに統合された1つのインスタンスだけが作業を実行できるようにライブラリを実装することです。つまり、1つのライブラリモジュールのみが「アクティブ」として機能する必要があります。ユーザーのデバイスにインストールされているアプリケーションがさらにある場合は、それらが重複しないようにする必要があります。
それを達成する方法は?ある種のパーミッション検証とクロスパッケージ検出について考えていましたが、それを実装する方法を想像することはできませんでした。
c++ - C++の手作りミューテックス
私は自分のプロジェクトのために手作りのミューテックスを作成しましたが、それがスレッドセーフかどうかは疑問です...
たとえば、スレッドAがwhileループを通過し、時間内にフラグをブロックせず(フラグを設定する時間がないfalse
)、スレッドBもwhileループを通過するとします。
出来ますか?なんで?
私が理解しているように、ミューテックスはまったく同じ仕事の原則を持っています。なぜこれがミューテックスで発生しないのですか?中断できないアトミック操作について読んだことがあります...では、
check-if-mutex-available
とmutex-block
は中断できませんよね?