[英]Redirecting standard output - Switched from VS2013 to VS2017, exception on writing
[英]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::async
的std::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.wait
或f.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.