[英]C++17 std::async non blocking execution
我創建了這個C ++ 17代碼來模仿我需要的東西。
std::cout << "start" << std::endl;
auto a = std::async([]() -> int {
std::this_thread::sleep_for(std::chrono::seconds{ 5 });
return 2;
});
std::cout << a.get() << std::endl;
std::cout << "stop" << std::endl;
線程在這里睡覺,但在實際示例中,我進行了大量操作,並且返回了可以為0、1或7的整數。這是我的輸出:
start
2
stop
很好! 此代碼不會凍結我的UI。 我知道a.get()
是一個阻止操作,但是有沒有一種方法可以阻止呢?
換句話說:代替
start
2
stop
我可以得到輸出
start
stop
2
使用async
? 我需要異步,因為我在線發現了需要返回值時非常有用。 這也很容易閱讀! 我不想使用std::packaged_task
,promises,future等,因為async
很容易。
如果不能不阻塞,我可以使用其他東西嗎?
此代碼將輸出您需要的內容:
std::cout << "start" << std::endl;
std::thread{
[]() {
auto a = std::async([]() -> int {
std::this_thread::sleep_for(std::chrono::seconds{ 5 });
return 2;
});
std::cout << a.get() << std::endl;
}
}.detach();
std::cout << "stop" << std::endl;
如果我是你,我根本不會使用async
。 如果您只需要顯示一個值而又不想阻塞,則應該執行其他操作。 例如:
std::cout << "start" << std::endl;
std::thread{
[]() {
//do here what you need and print the result
}
}.detach();
/* ... or ...
auto t = std::thread{ ... };
t.detach();
*/
std::cout << "stop" << std::endl;
看到detach()
使新線程“獨立”,並且在join()
阻塞時不會阻塞。 關鍵是async
必須阻塞,因為如果它必須執行花費大量時間的操作,那么它就必須花費時間!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.