C ++ 17 std :: async非阻塞执行

时间:2018-09-01 16:28:05

标签: c++ 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,promise和future等,因为async很容易。

如果不能不阻塞,我还可以使用其他东西吗?

1 个答案:

答案 0 :(得分:2)

此代码将输出您需要的内容:

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 必须被阻止,因为如果它必须执行花费大量时间的操作,那么它就必须花费时间!