問題タブ [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.
c++ - std::mutex、std::condition_variable、および std::unique_lock の使用
条件変数とミューテックスでの使用法を理解するのに苦労しています。コミュニティが助けてくれることを願っています。私はwin32のバックグラウンドを持っているので、CRITICAL_SECTION、HANDLE、SetEvent、WaitForMultipleObjectなどで使用されていることに注意してください.
これは、c++11 標準ライブラリを使用した同時実行の最初の試みです。これは、ここにあるプログラム例の修正版です。
これについていくつか質問があります。
「std::condition_variable を待機するスレッドは、最初に std::unique_lock を取得する必要がある」と読みました。
したがって、いつ終了が通知されたかを示す {quit mutex, condition variable & bool} があります。次のように、プロデューサー スレッドとコンシューマー スレッドはそれぞれ std::unique_lock を取得する必要があります。
これは私を混乱させています。これにより、最初のスレッドで終了ミューテックスがロックされ、2 番目のスレッドがブロックされませんか? それが本当なら、最初のスレッドはどのようにしてロックを解放し、他のスレッドが開始できるようにするのでしょうか?
もう 1 つの質問: wait_for() 呼び出しを 0 秒待機するように変更すると、そのスレッドは枯渇します。誰か説明できますか?while ループを実行する前にブロックしないことを期待します (タイムアウトの代わりに no_timeout が recv されると仮定するのは正しいですか?)。
wait_for() を呼び出してゼロ時間を指定して、wait_for() 呼び出しがブロックされず、代わりに条件をチェックして続行するにはどうすればよいですか?
また、この件に関する優れた参考文献についても知りたいと思います。
synchronization - 条件変数シグナリング
ここのこのリンクでは、インクリメント関数で、実際にカウントを(ゼロから)インクリメントする前に条件変数が通知されます。カウントを増やした後にシグナルを呼び出さないでください。または、decrement_count関数の待機呼び出しは、increment_functionでミューテックスが解放されるまで戻りませんか?
c++ - VisualStudio2012でネストされたstd::asyncをstd::condition_variableと使用する
すでにジョブの抽象化レイヤーを作成するためのWorker
クラスとクラスがあります。Handler
ミックスに非同期性を注ぎ込むために使用したかったstd::async
のですが、Visual Studio 2012(アップデート1)から奇妙な動作が発生しました。
私のクラス階層は次のとおりです。
Worker
は、純粋仮想メソッドを使用する抽象クラスInit
ですWork
。BasicWorker : Worker
単にprintf
いくつかの出力に使用しています。GroupWorker : Worker
他の労働者の集合体です。Handler
Worker
いくつかの仕事をするために保持します。
次にstd::async
、ワーカーとハンドラーを作成するいくつかのメソッドを呼び出し、ネストされた呼び出しでハンドラーを呼び出し、ワーカーのstd::async
初期化(ここ)を待ってstd::condition_variable
からハンドラーを停止します。
最後に、すべてのが終了するのを待ちstd::future
ます。
コードは次のとおりです。
私の問題は:
- 関数内の行のコメントを解除すると
WaitForInit@GroupWorker
、ネストされた非同期関数呼び出しは、すべての第1レベルの非同期関数呼び出しが行われるまで行われません。 - ジョブの数を増やすのを待っ
std::condition_variable
ている間、新しいスレッドの作成は指数関数的に遅くなるように感じます。100未満のジョブのトライアルでは、非同期が存在しますが、300を超えると、ジョブを作成するのは完全にシーケンシャルです。 - 次に
printf
、メソッドの行のコメントを解除するStart
と、ネストされたすべての非同期が魅力のように機能します
それで、
- 使用法で何が間違っています
std::condition_variable
か? - 何百ものスレッドのように、ジョブの作成が遅くなるのはなぜですか?(この質問はオプションであり、OSの問題のようであり、スマートスレッドプールの概念で修正できます)
- これとは何
printf
の関係がありますか?(競合状態の場合にすべての呼び出しを削除しようとprintf
しましたが、コードにブレークポイントを設定しましたが、ヘルプはありません。これも同じですstd::cout
)
編集:スレッドの作成を保証するための起動ポリシー(Jonathan Wakelyによって提案された)を追加しました。しかし、それも役に立ちませんでした。私は現在、第1レベルの非同期内で待機するための関数std::thread
と呼び出し関数を作成しています。thread::join
c - 誰も待っていないときに条件変数を通知することの重要性は?
並行性に関する本を読むとき、著者は、セマフォは、signal()の動作方法において条件変数とは異なると言います。セマフォはsignal()の呼び出し数を追跡しますが、条件変数は追跡しません。「誰も待っていないときにpthread_cond_signalを呼び出しても効果はありません」とそれは言います。この詳細が重要なのはなぜですか(さまざまな場所で何度も繰り返されているのを見てきました)。使用法にはどのような影響がありますか?ありがとうございました
c++ - VS2012 で C++11 条件変数を使用する
C++11 条件変数を使用するプロデューサーとコンシューマーで構成される単純な VS2012 コンソール アプリケーションでコードを確実に動作させることができません。私は、これらの Web サイトで収集したコードから、3 つの引数の wait_for メソッドまたはおそらく wait_until メソッドを使用する、信頼性の高い小さなプログラム (より複雑なプログラムの基礎として使用するため) を作成することを目指しています。
condition_variable : wait_for、 wait_until
以下のような述語で3つの引数wait_forを使用したいと思いますが、後で最も役立つようにクラスメンバー変数を使用する必要があります。約 1 分間実行しただけで、 「アクセス違反書き込み場所 0x_ _」または「無効なパラメーターがサービスまたは関数に渡されました」というエラーが表示されます。
3 つの引数 wait_for を置き換えるには、steady_clock と 2 つの引数 wait_until で十分でしょうか? 私もこれを試しましたが成功しませんでした。
以下のコードを無期限に実行する方法を誰かが示すことができますか?
信頼できるサンプル コードへのリンクも同様に役立ちます。
Visual Studio Desktop Express には 1 つの重要な更新プログラムがインストールされており、Windows Update にはその他の重要な更新プログラムはありません。Windows 7 32 ビットを使用しています。
c++ - 条件変数が待機しているスレッドオブジェクトのデストラクタを呼び出すとどうなりますか?
SynchronisedQueue
スレッド間の通信にを使用しています。アタッチしているスレッドが条件変数を待機しているときにスレッドオブジェクトを破棄すると、プログラムがクラッシュすることがわかりました。detach()
これは、スレッドが破棄される前に呼び出すことで修正できます。しかし、条件変数を待機しているスレッドが終了したときに正確に何が起こるのか疑問に思っています。これを回避するために条件変数を使用する別の方法はありますか?
c - 条件変数-予期しない動作
私はこれを行うために私のプログラムを作ろうとしています:
- 入力を取ります:
nrNodes
NrWorkers
- 3つのスレッド(ワーカー)は、現時点ではリスト(読み取り)にのみアクセスできますが、書き込みできるのは1つだけです。
5つのノードが完了したら(sqrt value)、停止して、リンクリスト内のすべての完了ノードをクリーンアップするクリーナースレッドを挿入する必要があります。これにより、作業が行われている残りのスレッドにアクセスが返されます。
スレッド1:semaphoreSlot();を取得します。仕事; 条件が達成された場合はシグナルを送信します。リストが解析されるまで。
スレッド2:待機信号; 綺麗; thread1へのアクセスを返します。
クリーン後:問題が発生しました。終了せずに停止します。
コード:
PS:動作します./s 1 1 ./s 1 4 ./s 4 4 ./s 4 1
クリーナーの呼び出し後に失敗します。x>=5の場合、。/sxnで失敗します。
task - TBBには、タスクの同期のためにcondition_variableが必要です
一部のプロジェクトでtbbを使用していますが、tbbタスクを使用する必要があります。
私のプログラムには、相互作用するN個のタスクがあります。
擬似コードは次のようになります。
N>>コア
このジョブにcondition_variableを使用すると、スレッドが停止し、スレッドがすべてのタスクを停止します。仕事を成し遂げるために使用できる方法はありますか?
リサイクルを使用しようとしましたが、CORE_NUMBERタスクのみが機能し、他のN-CORE_NUMBERタスクは実行を開始しません。
よろしくお願いします、
ゴラン
pthreads - pthread 同期に関するアドバイス/提案が必要 (条件変数とバリアの使用を組み合わせる)
次のシナリオがあります。
1 つのタスクをいくつかのステージに分割します。各ステージには実際の作業を行うためのスレッドがいくつかあります。後のステージのスレッドは、現在のステージのすべてのスレッドが完了するまで待機する必要があります。
例えば:
スレッド 1、2、3 はステップ 1 の作業を行っています。
スレッド 4、5、6 はステップ 2 の作業を行っています。
スレッド 7、8、9 はステップ 3 を実行しています ...
各ステップのスレッドは独立していますが、前のステップのスレッドが終了するまで待機する必要があります。
これを達成したい方法は次のとおりです。
- 現在のステップの各スレッドで、現在のステップを開始できるかどうかを表す条件で待機します
- 現在のステップを開始できるようになると、すべてのスレッドが作業を開始し、バリアでこのステップのすべてのスレッドが終了するのを待ちます
- このステップのすべてのスレッドが終了した後、次のステップのスレッドが待機している条件変数でブロードキャストします
それは理にかなっていますか?ここで何か明らかに間違っていますか?
マルチスレッド プログラムの高水準言語構造にうんざりしており、pthread API を使用するのは苦痛です。ここで、このユース ケースのベスト プラクティスについてアドバイスが必要ですか? どうもありがとう
c++ - boost::thread を使用して発生するスレッド ロック。条件変数の何が問題になっていますか?
ネットワーク内の 2 つのノード間でデータを渡すための Link クラスを作成しました。2 つの両端キュー (ノード 0 からノード 1 に向かうデータ用とノード 1 からノード 0 に向かうデータ用) を使用して実装しました。アプリケーションをマルチスレッド化しようとしていますが、スレッドロックが発生します。同じ両端キューからの読み取りと書き込みを同時に防止しようとしています。これを最初にどのように実装したかについて詳しく読むと、条件変数を間違って使用していると思います (ブール変数を使用するべきではないのでしょうか?)。各両端キューに 1 つずつ、合計 2 つのミューテックスが必要ですか? できれば助けてください。ありがとう!
push_back 関数:
取得機能:
ここで初期化します(役立つ場合に備えて)