2017-04-17 29 views
0

我想在C++中有一個在後臺執行異步任務的對象,但仍然可以通過代碼使用它來請求釋放,而不會破壞事情。如何在C++中構造一個執行異步後臺任務的對象

比方說,我有一個對象是這樣的:

class MyObj { 
    std::thread* asyncTask; 
    bool result; 
    public: 
    MyObj() { 
     asyncTask = new std::thread([this](){ 
     result = doSomething(); 
     }); 
    }; 
    bool isResult() { 
     return result; 
    }; 
} 

,你會如何去確保該對象可仍然沒有終止該進程(由於線程仍然可以釋放可連接/在破壞的同時運行)?我想過一些涉及用線程運行計數器來延遲析構函數的方法,但這似乎並不是正確的解決方案。部分複雜性是線程需要正常訪問類的元素,所以它不能分離。

+0

這似乎與以下情況更相關:https://cs.stackexchange.com/ – Jonas

+0

當線程句柄在線程之前被破壞時,您可以終止線程,殺死整個進程,等待線程完成或分離線程。所有這些選項都很糟糕。 – nwp

+0

如果線程需要訪問創建類的元素,那麼你實在別無選擇,只能延遲破壞外部類直到線程結束。 – lcs

回答

1

要做到這一點的唯一方法是創建一個新的進程來處理任務(昂貴的,大量的編組和繁忙工作),或讓線程進行合作。

定期合作的線程檢查是否應該中止。當它檢測到它應該中止時,它會這樣做。即使它在某些資源上被阻止,它也必須執行此操作

對於簡單的任務,這很簡單。對於一般任務,幾乎不可能。

C++編譯器基本上假設線程可以單線程操作,除非您去顯式同步操作。這允許某些重要的優化。成本是C++線程的狀態在任何時候都沒有任何意義;所以殺死它或暫停它在外部是不安全的(沒有合作)。

總之,寫下你的doSomething與合作和放棄在腦海中。

+0

謝謝,我希望能有更優雅的東西,但我想這將不得不做。 –