我创建了这个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
,承诺,期货等因为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
必须阻止,因为如果它必须做一个花费很多时间的操作,它必须花费那个时间!