- condition_variable
- 待つ()
- notify_one
- notify_all
condition_variable
実際の使用条件変数:
例えば、二つのスレッドAとBがあり、待機条件が成立スレッドA、(処理されるメッセージキューにメッセージがある)、データキューを失う専用スレッドBです。スレッドBデータに置かれたときに通知スレッドB Aは、ダウン開始します。キューに置かれた背景のデザイン・サーバは、そこに読み取りメッセージをブロックするスレッドがあり、それを解析し、その後、Bも知らさAをスレッド、キューから要求を取得して処理します。
アプリケーションサーバは、データを読み取るためにファイルを開くと同じであってもよいことが当A)ソケット。
b)は、スレッドBは、メッセージ・キューにデータおよびプットを読み出します。
C)スレッドBスレッドウェイクA、キューからデータを取得するためのスレッド。
D)サーバの完了は、要求を処理し、結果を返します。
条件変数クラス AがBを待機するようにしてもよいです。
:()ロックが空であるならば、作られた、すべての裁判官が空になるようにロックされ、二重のオリジナルコードを確認
processRequest {クラス のパブリックは: // QUEUEコマンドに追加 のボイドinMsgRecvQueue(){ のために(int型I = 0; I <100000; I ++){ // :: lock_guard STD <STD ::ミューテックス> sbguard(my_mutex) ; COUT << "インサート要素" << ENDL; m_msgRecvQueue.push_back(I); //想定コマンドキューは、プレイヤ表さ } //占有時間スライス } BOOL outMsgLULProc(INT&コマンド){ //二重ロックすることにより、回避することをすべてのプログラムは、ロックの両方で提供されます。 (m_msgRecvQueue.empty()!)IF { STD :: lock_guard <STD ::ミューテックス> sbguard(my_mutex); IF(m_msgRecvQueue.empty()!){ int型= m_msgRecvQueue.frontコマンド(); m_msgRecvQueue.pop_front()。 真の復帰に; } falseに復帰; } } outMsgRecvQueue {)(空 INTコマンド= 0; {(;; I <100000 I ++ int型I = 0)のための BOOL outMsgLULProc結果=(コマンド); (真の結果==)IF { COUT <<「outMsgRecvQueue()の実行「; << ENDL要素を削除 } 他 { <<はCOUT」outMsgRecvQueueは()も実行されるが、メッセージ・キューは、<< ENDL」空である; //メッセージ・キューが空である } //占有時間スライス } } プライベート: STD: :リスト<整数> m_msgRecvQueue; //コマンドを表すための容器は、プレイヤーから送られ STD :: my_mutexミューテックスを; };
使用クラスのstd ::条件の履行を待つために、ダブルロックを交換するcondition_variableは、時間と作業して、このクラスのニーズやミューテックスは、オブジェクトのクラスを生成するために必要。
pirvate: STD :: condition_variable my_condition。
待つ()
キューの変更:待ち時間がここでスタックしている、あなたはキューのスレッドを変更する必要があります。
outMsgRecvQueueボイド(){ int型コマンド= 0; 一方、(真の){ STDのunique_lockのは:: <STD ::ミューテックス> sbguard1(my_mutex); my_condition.wait(sbguard1、[これ] { !IF(m_msgRecvQueue.empty())/ /ラムダ式は、コール・オブジェクト(機能)である 。真に戻る 他の falseに復帰; }); //待機事待ち時間がために //待機(PARA1、PARA2) // PARA1:ミューテックス // PARA2:最初の二つのパラメータラムダ式は値がFalseを返す ので、ミューテックスのロックを解除します//、と)別のスレッドの呼び出しのnotify_one(までラインを遮断し 、その後、同じように2番目のパラメータはFalseを返す何も第二引数がない場合//同様の効果 } }
もちろん、待機した後、()の早期unique_lockの()、および実行ロジックを解くことができます。
notify_one
オリジナルのブロックされたプロセスが目覚めました。待ち時間が復旧作業を開始した後、および回復
a)は、待機()は常にミューテックスのロックを取得しようとすると、ロックを取得しよう。あなたがロックを取得できない場合取得し、待ち時間がダウンした場合、プロセスは、ここで待機して立ち往生。
b)は、実際に等しいのロックを取得し、それをロック。待機二番目のパラメータ(ラムダ)場合には、決定したラムダ式で、
式は、ミューテックスロック解除今度は、偽の場合。そして、睡眠に別のスレッド。
式が真の場合、待機返却処理は、(ミューテックスがこの時点でロックされている)下がります。
2番目のパラメータは待機しない場合は、戻りを待ちます
inMsgRecvQueue {)(無効 (int型I = 0; I <100; I ++)について{ STD :: lock_guard <STD ::ミューテックス> sbguard(my_mutex); m_msgRecvQueue.push_backは、(I); //キューが表されていることを想定選手コマンド COUT << "インサート要素" << ENDL; my_condition.notify_one(); } //占有時間スライス }
同時に、ロックを得る可能性:
1)空inMsgRecvQueue()
2)無効outMsgRecvQueue()
競争のロックの可能性が生じる可能性があると同時に、それはあなたがoutMsgRecvQueueに実行する場合と言うことです()少なくとも一つの要素にキューが、それは内と発生する可能性が注文執行のうちケースがないとき、ステートメントのロジックが実行されます。
遅延の論理的な文の実装で外に、この場合のをきっかけに、カード出た場合は、この時間notify_one()の呼び出しは効果がありません)待ち(の状態ではありません。
ディープ思考
コマースでの書き込みコードは、理解されなければなりません。
スレッドエントリポイントでは、複数のデータキューがあるかもしれませんが、今回は実行する方法に対処しますか?より多くのスレッド処理を開きますか?または200個の未処理データに対して、電流制限、それが立ち往生?