C++11中async中future用法(一)

async意味着异步执行代码,看如下示例:

#include <future>
#include <thread>
#include <chrono>
#include <random>
#include <iostream>
#include <exception>

using namespace std;

int do_something(char c)
{
    std::default_random_engine dre(c);
    std::uniform_int_distribution<int> id(10, 1000);

    for (int i = 0; i < 10; ++i)
    {
        this_thread::sleep_for(chrono::microseconds(id(dre)));
        cout << c << ends;
    }

    return c;
}



int main() {
    cout << "begin ..." << endl;
    std::future<int> result = std::async(do_something, 'c');
    cout << "waiting for result ..." << endl;
    cout << "\n" << result.get() << endl;
    cout << "finish!" << endl;
}

当对result调用get时,如果此时do_something函数还没有执行完毕,那么会导致main函数阻塞在这里,一直到该函数执行完毕。

async返回的是一个future对象,从字段意思上推测,结果是在未来的某一个时刻拿到。

async实际上是在背后偷偷的开启一个线程执行函数,但是上面的实例看不出来,于是我们写一个复杂一些的实例:

#include <future>
#include <thread>
#include <chrono>
#include <random>
#include <iostream>
#include <exception>

using namespace std;


int do_something(char c)
{
    std::default_random_engine dre(c);
    std::uniform_int_distribution<int> id(10, 1000);

    for (int i = 0; i < 10; ++i)
    {
        this_thread::sleep_for(chrono::microseconds(id(dre)));
        cout << c << ends;
    }

    return c;
}


int func1()
{
    return do_something('.');
}

int func2()
{
    return do_something('*');
}


int main()
{
    cout << "start ..." << endl;
    // std::future<int> result1(std::async(std::launch::deferred, func1));
    std::future<int> result1(std::async(func1));

    int result2 = func2();

    int result = result1.get() + result2;

    cout << "\nresult of func1() + func2(): " << result << endl;
}

这个程序的执行结果中 .和*乱序出现,说明func1和func2是乱序执行的,这是因为func1是在另一个线程中执行的。
原文链接: https://www.cnblogs.com/inevermore/p/5092667.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/226654

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 下午1:19
下一篇 2023年2月13日 下午1:19

相关推荐