簡體   English   中英

從VS2013到VS2017 std :: async不會啟動新線程

[英]From VS2013 to VS2017 std::async does not start a new thread

我將Visual Studio從2013年更新為2017年。編譯正常,但似乎std :: async調用未打開新線程。 (調試時,我無法在線程窗口中看到一個新線程。而且看起來像調用async函數的線程可以完成工作...)

那就是我的函數調用:

std::async(std::launch::async, myfunction, this); 

我沒有更改代碼,在VS2013中一切正常。

任何想法? Google不能告訴我很多有關此的信息,但是也許我輸入了錯誤的關鍵字。 因此關鍵字也有幫助!

謝謝

您需要堅持async返回的std::future ,否則臨時對象的析構函數將阻塞,直到工作完成。

auto t = std::async(std::launch::async, myfunction, this);

在VS2013中, std::async不遵守C ++標准。

意見分歧,開發MSVC的開發人員希望std::asyncstd::future的行為與其他std::future

該標准不同意。

他們在2013年發布了不符合std::future 。在2015年,如果我沒記錯的話,他們開始遵循該標准。

該標准指出,擁有std::async( std::launch::async生成的共享狀態)的std::future的析構函數將阻塞,直到任務完成。

這是因為在實踐中,懸掛線程對於以可預測方式運行的程序不利。

您現在負責擁有和堅持future回報

auto f = std::async(std::launch::async, myfunction, this); 

當需要准備就緒時,請f.waitf.get它。

這可能需要更改代碼的工作方式。 例如,保持周圍期貨的矢量(如果你有一個以上的),或添加std::future<?>成員this並將其存儲(這也保證了異步調用不會活得比對象一生! )。


第二點,Windows上的std::async也使用有界線程池。 如果有多個async任務處於活動狀態,則可能不會啟動新任務。

他們有修復它的計划(因為它違背了標准中的建議),但是在這一點上,我仍然建議使用std::thread ,如果需要std::async類的行為,請自己實現類似的功能。

我的個人趨勢是創建特定於問題的thread_pool ,該std::thread擁有一定數量的std::thread ,但是讓您將任務排隊並從中獲取future s(具有給我擴展功能的自定義擴展名,它們的延續能力非常有限)。

這使線程所有權和依賴關系更加明確,並避免了處理仍然存在的MSVC非標准兼容怪癖。

看起來std :: async正在等待返回結尾。 因此,如果您稱呼它,則不會異步工作。

std::async(std::launch::async, myfunction, this);

關鍵是定義答案:myfunction必須返回std :: future,並且您需要定義和相同類型的響應。

std::future<int> foo = std::async(std::launch::async, myfunction, this);

如果在構造函數內部調用std :: async,則foo必須是該類的成員。

class MyClass {
    //Your code
    private:
        std::future<int> exitThread;
}

而且,當您調用std :: async必須

exitThread = std::async(std::launch::async, myfunction, this);

很簡單的解決方案:

std::thread t(myfunction, this);
t.detach();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM