2016-04-26 16 views
0

私はC++ 11コードで複数のスレッドを実行しており、スレッド本体は以下のようにラムダ関数を使って定義されています。C++で外部からスレッドを終了する

// make connection to each device in a separate child thread 
std::vector<std::thread> workers; 
for(int ii = 0; ii < numDev; ii++) 
{  
    workers.push_back(std::thread([=]() { // pass by value 

    // thread body 

    })); 
} 

// detach from all threads 
std::for_each(workers.begin(), workers.end(), [](std::thread &t) { 
    t.detach(); 
}); 

// killing one of the threads here? 

私はすべての子スレッドから切り離しましたが、それぞれの子スレッドを従業員ベクトルで参照しました。どのように私のコードで後でスレッドのいずれかを殺すことができますか?

投稿hereは、std::terminate()を使用していますが、私の場合は使用していないと思います。

+0

[C++ 11でスレッドを終了するにはどうすればいいですか?](http://stackoverflow.com/questions/12207684/how-do-i-terminate-a-thread-in-c11) –

+1

あなたが非協力的にスレッドを殺すと、どのようにあなたのプログラムについて何らかの保証を与えることができますか? – imreal

答えて

1

まず、raw std::threadを使用しないでください。彼らはめったに良い考えではありません。手動でnewdeleteを呼び出すか、またはioコードで生のバッファと長さカウンターを混乱させるようなものです - 発生するのを待っているバグです。

第2に、スレッドを強制終了する代わりに、スレッド・タスクに、いつワーカー自身が強制終了するかを示す関数または原子変数を指定します。

労働者は定期的に「すべきか」の状態をチェックし、もしそうなら、自分自身をきれいにして死にます。

次に、作業員に死亡を知らせて、それを待ってください。

これはワーカースレッドでの作業を必要とします。また、中断されずに長時間続くタスクは機能しません。中断されず、長時間続くタスクをしないでください。

の場合はとする必要があります。そのような作業を別のプロセスで行い、結果を前後に並べ替えます。しかし、現代のOSはIOタスク用に同期APIの代わりに使用できる非同期APIを持つ傾向があります.IO APIを使用すると、注意が必要な場合に中止されることがあります。

スレッドが任意の状態になっている間にスレッドを終了すると、プログラムは不明で未定義の実行状態になります。それはミューテックスを保持していて、たとえば、標準的なライブラリ呼び出しの中に置かないようにすることができます。しかし、実際には、何でもできる。

一般に、スレッドを分離することは悪い考えです。なぜなら、それらが終了したことを魔法のように認識していなければ(難しいため、難しいので)、主目的が実装定義の後にどうなるかです。

あなたのメモリ割り当てを追跡するように、スレッドを追跡しますが、moreso。メッセージを使ってスレッドに自分自身を殺すよう指示します。スレッドに参加してリソースをクリーンアップし、おそらくラッパーの条件変数を使用して、基本的にスレッドが実行される前に参加しないようにします。生スレッドの代わりにstd::asyncを使用し、さらに抽象化してstd::asyncをラップしてください。

+0

**スレッドを殺すのではなく、スレッドのタスクに、いつワーカーが自分自身を殺すべきかを示す関数または原子変数を与えます。** ok。私はこのアプローチを使用します。 – ManiAm