2017-01-04 13 views
4

私のアプリケーションでは、時間がかかる作業のために複数のスレッドを使用しています。これは、アプリケーション全体で実行することを意図しています。私が達成しようとしているのは、アプリケーションを終了する直前に2番目のスレッドでループを終了させるための素敵できれいなアプローチです。ループの後にきれいにしてからすべてを閉じることができます。別のスレッドで無限ループを停止する

これまでのところ、私はこのアプローチを作ってみたが、私はそれの巨大なファンではない正直に言うと:ちょうどわずかな変化で

#include <iostream> 
#include <thread> 

bool stop_flag; 

void foo() 
{ 
    while(!stop_flag) 
    { 
     //do something 
    } 
    clean_after(); 
} 

int main() 
{ 
    stop_flag = false; 
    std::thread whileThread(foo); 

    // app lifetime 

    stop_flag = true; 
    whileThread.join(); 
    return 0; 
} 
+3

は、「私はそれの巨大なファンではない」 - それはそうです、私はそれを渡すのアイデアと言ってんだ – dasblinkenlight

答えて

3

複数のスレッドから同じ非同期変数への読み書きは、とにかく未定義の動作です。 Fanかどうかに関わらず、コンパイラはチェックを最適化するだけで、ループが開始したり終了したりすることはありません。

前述のように、std::atomic_boolを使用できます。私はそれをグローバルに行うファンではありません - それを "キャンセルトークン"としてfooに渡してください。

void foo(std::atomic_bool& cancellation_token) 
{ 
    while(!cancellationToken) 
    { 
     //do something 
    } 
    clean_after(); 
} 
+0

:-)壊れたソリューションのファンになりたくありませんこの場合、fooも私のために良く見えます。 – sebap123

+0

引数として渡すと、複数の場所からスレッドを停止するのが難しくなります。 –

9

、あなたのコードは、罰金になります:

std::atomic<bool> stop_flag; 
関連する問題