2017-02-23 50 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

'join'告訴你線程已經完成。 – knivil

+6

['std :: future'](http://en.cppreference.com/w/cpp/thread/future)可能是你想要使用的 – WhiZTiM

+0

@knivil:它阻塞直到線程結束。因此,如果已加入線程,但您知道該線程已完成,但使用'join'沒有「*線程還未完成*」選項。 – Pixelchemist

回答

0

我有同樣的問題,我的解決辦法是換線程類,這樣我就可以設置一個標誌,當函數完成其工作。

這裏你可以找到的解決方案Stack Overflow

這裏是工作示例的討論:Celma managed thread

+1

'volatile'不會阻止數據競爭。 –

+0

@πάνταῥεῖ很明顯,您沒有閱讀整個主題,也沒有看到源代碼,然後點擊downvote按鈕。 – Rene

+0

@πάνταῥεῖ工作示例不使用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 
    } 
} 

在鄰療法手,你可以簡單地使用「安全」(或原子)標誌的作品想:

#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並使用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... 
相關問題