2017-02-23 7 views
3

スレッドがC++ 11以上で作業を終了したかどうかを確認する方法はありますか?私は、ドキュメントを読んでいると私は、次のコードを書かれている:スレッドがC++ 11以上で作業を終了したかどうかをチェックする方法は?

#include <iostream> 
#include <thread> 
void mythread() 
{ 
    //do some stuff 
} 
int main() 
{ 
    std::thread foo(mythread); 
    if (foo.joinable()) 
    { 
    foo.join(); 
    //do some next stuff 
    } 
} 

joinableは、スレッドが作業を開始したことのみを伝えますが、私は、スレッドが作業を完了したかどうかを確認するコードを書く方法を知っていただきたいと思います。例えば

#include <iostream> 
#include <thread> 
void mythread() 
{ 
    //do some stuff 
} 
int main() 
{ 
    std::thread foo(mythread); 
    if (foo.finishedWork()) 
    { 
    foo.join(); 
    //do some next stuff 
    } 
} 
+0

スレッドが完了したことを通知します。 – knivil

+6

['std :: future'](http://en.cppreference.com/w/cpp/thread/future)はおそらくあなたが使いたいものです – WhiZTiM

+0

@knivil:スレッドが終了するまでブロックします。したがって、スレッドが結合されてもスレッドは終了するが、 'join is 'を使って「* thread is finished yet *」オプションがないことがわかる。 – Pixelchemist

答えて

0

私は同じ問題を抱えていたし、私の解決策は、スレッドクラスをラップすることだったので、関数がその作業を終えたとき、私はフラグを設定することができます。

ここでは、ソリューションStack Overflow

そして、ここのための議論が作業例です見つける:Celma managed thread

+1

'volatile'はデータ競合を防ぎません。 –

+0

@πάνταῥεῖ明らかに、downvoteボタンを押す前にスレッド全体を読んだり、ソースコードを見たりしていませんでした。 – Rene

+0

@πάνταῥεworkingこの例ではvolatileを使用していません。それは(正しく) ''を代わりに使用します。 –

4

あなたはstd::futureを使用したい場合があり、それはあなたが自明非同期計算かどうかを確認することができ、より高いレベルの機能を提供終了する(別名レディ):例:φ

void mythread() { 
    //do some stuff 
} 

template<typename T> 
bool future_is_ready(std::future<T>& t){ 
    return t.wait_for(std::chrono::seconds(0)) == std::future_status::ready; 
} 

int main() 
{ 
    std::future<void> foo = std::async(std::launch::async, mythread); 
    if (future_is_ready(foo)){ 
     //do some next stuff 
    } 
} 

THER手、あなたは単に「安全な」(または原子)フラグを使用するとうまくいくと思うことがあります。それは動作しない、

#include <iostream> 
#include <thread> 

std::atomic<bool> is_done{false}; 

void mythread() 
{ 
    //do some stuff 
    ...... 
    is_done = true; 
} 
int main() 
{ 
    std::thread foo(mythread); 
    if (is_done) 
    { 
    foo.join(); 
    //do some next stuff 
    } 
    ..... 
    if(foo.joinable()) foo.join(); 
} 

しかし。あなたはis_done = trueが最後に行ったことだと思うのですが、mythread()です。その範囲内にという自動保存期間の一部のオブジェクトを作成している可能性があります。そのようなオブジェクトは構造の逆順で破棄されるため、is_doneを設定した後もそのスレッドにはまだ作業が行われます。

1

未来が欲しい。スレッドをstd::asyncで開始し、0秒でwait_forを使用してください。結果をfuture_status::readyと比較してください。

0

wait_forstd::futureにすると、結果が既に存在するかどうかを確認できます。非同期タスクの未来を手に入れる簡単な方法はstd::asyncです。

#include <future> 

// ... 

// launch task and get result future 
auto rf = std::async(std::launch::async, mythread); 
// get initial status 
auto status = rf.wait_for(std::chrono::nanoseconds(1)); 
// loop while task is not ready 
while(status != std::future_status::ready) 
{ 

    // not ready yet, do other stuff here 

    // 1 nanosecond timeout check 
    status = rf.wait_for(std::chrono::nanoseconds(1)); 
} 
// we are done... 
関連する問題