問題タブ [condition-variable]
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 - Win32 API を使用して Java のような同期 (モニター) を実装するにはどうすればよいですか?
各 Java オブジェクト (およびそのクラス) には、関連付けられたモニターがあります。pthread 用語では、Java モニターは再入可能ミューテックスと条件変数の組み合わせに相当します。
ロックのために、Win32 API は Mutex オブジェクト (再入可能ですが重量が大きい) とクリティカル セクション (再入不可ですが軽量) を提供します。また、セマフォやイベントなどの他の同期構造も提供しますが、条件変数の明示的な概念はありません。
JVM を作成している場合、これらの Win32 の概念を使用して Java モニターを実装するにはどうすればよいでしょうか?
c - pthread_cond_wait と pthread_cond_signal で譲歩を保証
グローバル変数、ミューテックス、条件変数を共有する 3 つの POSIX スレッドを持つ C プログラムがあり、そのうちの 2 つが次の疑似コードを実行しているとします。
そして3回目の実行:
3 番目のスレッドが最初の 2 つのスレッドのそれぞれからのデータを見ると仮定しても安全でしょうか?
別の言い方をすれば、スレッドがミューテックスと条件変数を待機している場合、ロックを待機している可能性のある他のスレッドではなく、シグナルが送信された場合にロックを取得する次のスレッドであると想定しても安全ですか?ロック?
c - pthread_cond_wait がミューテックスのロックを解除しない
Mac OS X で奇妙な動作をするという証拠をオンラインで見つけることはできませんがpthread_cond_wait
、私にとって最も単純なテストでは失敗しているようです。
関数
ミューテックス引数 #2 のロックを解除し、条件引数 #1 でシグナルが送信されるのを待つことになっています。これをテストし、偽のウェイクアップもテストする簡単なプログラムを作成しました。
ただし、ロックを取得するのは 1 回だけです。メインスレッドは、物事を単純にするためだけにロックを取得しようとさえしません。
pthread_mutex_unlock
の後にa を追加するとpthread_cond_wait
、期待どおりに動作します。(または、ロック機構の半分だけで期待どおりです。) それで、何が得られますか?
c - C で条件変数を使用してプライオリティ キューを実装する
条件変数に関する私の現在の理解では、すべてのブロックされた (待機中の) スレッドは基本的な FIFO キューに挿入され、その最初の項目は signal() が呼び出されたときに呼び出されます。
このキューを変更 (または新しい構造を作成) して優先キューとして実行する方法はありますか? 私はしばらくそれについて考えてきましたが、CV とミューテックスに固有の既存のキュー構造によって、私が経験した解決策のほとんどが妨げられてしまいます。
ありがとう!
python - ポーリングせずにタイムアウトをより適切にサポートするPythonのthreading.Condition変数に代わるものはありますか?
タイムアウトが必要なスレッドで条件変数を使用しています。多数のスレッドを実行しているときにCPU使用率を確認するまで、スレッドモジュールで提供される条件変数は実際にはスリープしませんが、引数としてタイムアウトが提供されるとポーリングすることに気づきませんでした。
実際にpthreadのようにスリープするこれに代わるものはありますか?
多くのスレッドが複数秒間隔でスリープしているのに、CPU時間を消費しているだけの場合は苦痛のようです。
ありがとう!
.net - .NET で信号を複雑な回路に接続する方法は?
いくつかの並行コードでは、回路のように多数の信号を接続したいと考えています。.NET では、シグナルのコレクションに対して WaitAll または WaitAny を実行できます。私はこのようなことをしたい:
残念ながら、ライブラリはこれらの操作をより複雑なツリーに構成することをサポートしていません。私の質問は (1) .NET でこれを行う方法はありますか? (2) このための洗練されたライブラリはどの言語にもありますか?
[編集: コーリーが詳細を尋ねた]
メッセージパッシングライブラリを構築したい。10K の小さな同時キューが存在する可能性があり、メッセージを含むものもあります。キューからメッセージを取得し、キューに割り当てられたハンドラーを実行したいと考えています。ただし、ハンドラーが完了するまで次のメッセージを取得することはできません (キューごとにシングル スレッド)。したがって、次の項目をポップして実行する前に、キュー (メッセージを受け取った?) とコード (前のメッセージで終了した?) の両方を待ちたいと思います。
c++ - 生産者/消費者の状況での条件変数の使用
条件変数と、それを生産者/消費者の状況で使用する方法について学習しようとしています。あるスレッドが番号をキューにプッシュし、別のスレッドがキューから番号をポップするキューがあります。生成スレッドによって配置されたデータがある場合に、条件変数を使用して消費スレッドに信号を送りたいと思います。問題は、最大2つのアイテムをキューにプッシュしてからハングする場合があります(またはほとんどの場合)。デバッグモードで実行すると停止する場所をproduce()関数で示しました。なぜこれが起こっているのかを誰かが指摘するのを手伝ってもらえますか?
次のグローバル変数があります。
以下は私の消費者スレッドです:
以下は私のプロデューサースレッドです: