問題タブ [thread-synchronization]
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++ - 比較して交換する vs テストして設定する
誰かがマルチスレッドでの上記の操作の動作と違いを説明してもらえますか?
object - スレッド同期をロックするための適切なオブジェクトを選択しますか?
通常、コードサンプルは次のようにロックを使用します。
このように、大きなクラスでは多くのロックが必要です。共有オブジェクト自体を同期オブジェクトとして使用することをお勧めしますか?
multithreading - セマフォの小さな本
以下は、各スレッドが他のスレッドがランデブー部分を完了するまで待機し、全員がクリティカル セクションを完了するまで待機する必要があるコードです。
2 つのプロセスが同じカウント値 (0 または n の可能性がある) を参照するケースに到達する可能性があることを私は知っています。このため、2 つ以上の信号が同時に送信される場合があります。最後のテストでデッドロックが発生する可能性があります。私はこれを理解していないようです。
これは回転式のセマフォ配置であり、作者は実際には回転式改札口であると考えていますが、これはセマフォであり、デッドロックなしで動作するはずです。このコードにデッドロックがある理由を教えてください!
java - Java のセマフォでのライブラリアン リソース割り当ての問題
この 2 部構成の質問について教えてください。最初の部分は次のとおりです。
(パート 2: コードを更新しました - 要件が少し変更されました。)
Java でライブラリアンの問題を実装しようとしています。ウィキペディアのセマフォのページでは、セマフォのライブラリのアナロジーが提供されています。最初の部分では、この問題をモデル化しようとしています。私の場合、ルームの代わりに [対象分野の専門家] をリソースとして使用しています。
図書館に 10 室の同一の自習室があり、一度に 1 人の学生が使用することを想定しているとします。学生が自習室を利用したい場合は、紛争を防ぐためにフロントカウンターから部屋をリクエストする必要があります。部屋の使用が終わったら、学生はカウンターに戻り、1 つの部屋が空いたことを示さなければなりません。空いている部屋がない場合、学生は誰かが部屋を放棄するまでカウンターで待ちます。
部屋は同一であるため、フロント デスクの司書はどの部屋が使用されているかを把握しておらず、空いている部屋の数のみを把握しています。学生が部屋をリクエストすると、司書はこの数を減らします。学生が部屋を解放すると、司書はこの数を増やします。部屋へのアクセスが許可されると、その部屋は必要な期間使用できるため、事前に部屋を予約することはできません。
私の実装で直面している問題は、学生と主題の専門家との関連付けに関するものです。次のシナリオでこれをどのように行いますか? SubjectMatterExpert
学生証を印刷するだけです(今のところ)。
パート 2: 新しい要件:
- 学生、SME、ブック クローゼットの固定数があります
- 学生は最初に特定の数の本を持っています (現在、本は単なる数字です)
- SME はブック クローゼットから本を追加またはチェックアウトします。生徒のリクエスト
- 生徒は追加またはチェックアウト アクション、本の数、ブック クローゼットを指定します
これは変更 (編集) された Student クラスです。
これは変更 (編集) されたライブラリアン クラスです。
これは、修正 (編集) された Subject Matter Expert クラスです。
これは、変更 (編集) された Simulator クラスです。
これは (新しい) Book Closet クラスです:
c# - C#.NET スレッドに関する質問
C#.NET アプリケーションのスレッド間の通信で問題に直面しています。誰かが可能な解決策について正しい方向に導いてくれることを願っています。
私は C#.NET でアプリケーションを持っています。これは Windows フォーム アプリケーションです。私のアプリケーションには 2 つのスレッドがあります。1 つのスレッドはメイン スレッド (UI スレッド) で、もう 1 つは子スレッドです。子スレッドを「workerThread」と呼びましょう アプリケーションで使用されるフォームは 1 つだけです。このフォームを「MainForm」と呼びましょう
MainForm が読み込まれると、子スレッドが開始されます (フォームの「Load」イベント ハンドラを使用してスレッドを開始します)。
MainForm クラスには、パブリック ブール変数である「stopWork」という名前の変数があり、子スレッドが引き続き動作するか停止するかを示すフラグとして機能します。
子スレッドで実行するメソッドを含む別のクラス (MainForm クラス以外) があります。この 2 番目のクラスを「WorkerClass」と呼びましょう。現在のフォーム (MainForm) への参照を「WorkerClass」のコンストラクターに渡します。
メインフォームに「停止」ボタンがあり、クリックすると「stopWork」を「true」に設定し、「workerThread.Join()」を呼び出して子スレッドが実行を終了するのを待ちます。
子スレッドでは、メソッド「doWork」がforループ内の「parentForm.stopWork」のステータスをチェックし続けます。「stopWork」が「true」に設定されている場合、ループが中断され、その後メソッドが終了します。
さて、問題は、「停止」ボタンをクリックすると、アプリケーションがハングすることです。
理解しやすいように、以下のコードの一部を貼り付けています。
問題がどこにあるかを知ることができると思います。問題は、「workerThread.Join()」メソッドを呼び出して親フォームが既にブロックされているときに、親フォームの「stopWork」変数にアクセスしようとする子スレッドの「doWork」メソッドにあります。したがって、これは「デッドロック」の問題だと思います。
問題を特定するのは正しいですか?それとも私が間違っていて、問題は別の場所にありますか?
これが実際にデッドロックである場合、これを解決するための可能な解決策は何ですか?
少しグーグルで調べたところ、スレッドの同期とデッドロックを回避する方法に関する多くのリソースが見つかりました。しかし、私の問題に具体的に適用する方法がわかりませんでした。
この問題を解決するためのヘルプやガイダンスをいただければ幸いです。
c++ - CMutex::Lock vs. CSingleLock::Lock
I've been tapped to support some legacy code, and I'm seeing some things that cause me to scratch my head in confusion. In some sections of code, I see that a class instance uses a CMutex instance to synchronize method execution. For instance
Elsewhere in the same project I find that the code is using a CSingleLock
After reviewing MSDN documentation for synchronization, it would appear that CClassB is implementing the advised method, but it isn't clear to me what the danger is in the implementation used by CClassA. As far as I can tell, the only difference between the two methods is that CSingleLock has the benefit of RAII, so the lock is automatically released when execution exits scope. Are there any other benefits / drawbacks to either implementation?
multicore - 揮発性変数とマルチコア スレッド同期!
複数のスレッドを同時に実行し、独自のオブジェクトのフィールドの値をチェックしています。フィールドは、起動スレッドによって次のように設定されます。
各スレッド内で、この値の値を確認します。
ただし、4 コア CPU では、変更された MyField を確認するために、(4) 実行中のスレッドの一部が数ミリ秒またはそれ以上の時間を必要とすることに気付きました。MyField は単一の char フィールドです。何が起こっているように見えるかというと、変更を検出した最初のスレッドによってメモリ バスが使い果たされると、他のすべてのスレッドが、最初の実行のほぼ全期間にわたって停止する可能性があるということです。(十分なメモリ プレッシャがあると仮定します)。最初のスレッドがメモリを解放したとき (およびレジスタをさらに処理したとき) にのみ、他のスレッドも新しい値を認識できるようになります。
私はasmをチェックしましたが、途中でコンパイラの最適化はありません。呼び出しは直接メモリに送られます。これはどのように修正できますか?
ありがとう!混雑する
c# - スレッド同期
スレッド間でデータを共有する必要があります。最適な同期方法はどれですか?
ロックはより良いアプローチですか、それともミューテックスですか?
multithreading - バイナリセマフォを使用したバリア(同期構造)の実装
バリアは、プロセスのセットがグローバルに同期する同期構造です。つまり、セット内の各プロセスがバリアに到着し、他のすべてのプロセスが到着するのを待ってから、すべてのプロセスがバリアを離れます。セット内のプロセスの数を3とし、Sを通常のPおよびV関数を持つバイナリセマフォとします。左側に行番号が示されているバリアの次のC実装について考えてみます。
変数process_arrivedとprocess_leftはすべてのプロセスで共有され、ゼロに初期化されます。並行プログラムでは、3つのプロセスすべてが、グローバルに同期する必要があるときにバリア関数を呼び出します。
上記の実装は機能しますか?2つのバリア呼び出しがすぐに連続して使用されると、デッドロックにつながる可能性があると思います。バリアに入る最初のプロセスは、process_arrivedがゼロになるまで待機してからP(S)の実行に進むためです。