2017-01-13 1 views
4

私はstd :: conditional_variableを使用して、さまざまなクリティカルセクションのフローを制御するマルチスレッドプログラムの信号をタイミング調整しています。プログラムは動作しますが、終了時には、std :: conditional_variable :: wait()でまだ待機しているスレッドの破壊を避けるために、述語(kill_ == true)を使用するように強制されています。私は待っているすべてのスレッドを破棄する適切な方法、アドバイスを求められたかどうかわからない。私は待機中のスレッドの破壊を処理する方法メインプログラムの終了時にstd :: conditional_variableで待機しているスレッドを破棄する適切な方法

class timer 
{ 
    // ... 
     timer(std::shared_ptr<parent_object> parent,const bool& kill) 
     :parent_(parent),kill_(kill){} 

    private: 
     std::condition_variable cv_command_flow_; 
     std::mutex mu_flow_; 
     const bool& kill_; 
     std::shared_ptr<parent_object> parent_; 
}; 

void timer::section() 
{ 
     auto delay = get_next_delay(); 

     std::unique_lock<std::mutex> lock(mu_flow_); 
     std::cv_command_flow_.wait_until(lock,delay,[] { return kill_ == true; }); 

     if(kill_) return; 

     parent_->trigger(); 

     std::cv_command_exec_.notify_all(); 
} 
+0

['notify_all'](http://www.cplusplus.com/reference/condition_variable/condition_variable/notify_all/)を試しましたか? – iammilind

+1

用語の問題:スレッドを終了するか、スレッドを最後まで実行しますか?あなたは「糸の破壊」によって何を考えますか? –

答えて

3

これは一般的である:ここではコードスニペットです。私はtimer::section()の内で実行されたことを仮定してい

{ 
    std::lock_guard<std::mutex> lock(mu_flow); 
    kill_ = true; 
} 
cv_command_exec_.notify_all(); 
thread1.join(); 

:あなたは(など、クラスのデストラクタ、プロセスの終了前にメインスレッドで)クリーンアップを実行したいこのようなコードセクション勧めしますいくつかのスレッドstd::thread thread1

mutexの所有期間は、有効範囲ブロックによって制御されます。 kill_ = trueを設定してから.notify_all()に電話する前にリリースされている場合にのみ、ミューテックスを保持することをお勧めします(そうしないと、目覚めたスレッドによってロックがまだ保持され、スリープ状態に戻ることがあります)。もちろん

、STD :: unique_lockの使用量は次のようになります。

std::unique_lock<std::mutex> lock(mu_flow); 
kill_ = true; 
lock.unlock(); 
cv_command_exec_.notify_all(); 
thread1.join(); 

それはかなりの程度に個人的な好みです...両方のコードのセクションでは、同じタスクを達成します。

+0

フィードバックをいただきありがとうございます。 Timerは別のオブジェクトのサブセットであり、プログラムの全期間を通して使用されます(thread.detach()が使用されます)。 kill_(= const)信号は、終了時にのみメインプログラムから設定されます。 lock_guardよりもstd :: unique_guardが優先され、ロック/アンロックが可能です。 – ark1974

+0

std :: lock_guardとstd :: unique_lockにコメントを追加しました。 –

関連する問題