C++17 标准::异步非阻塞执行



我创建了这个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必须阻止,因为如果它必须执行需要大量时间的操作,它必须花费这些时间!

最新更新