C/C++知识点之C++并发编程 异步任务
小标 2019-01-21 来源 : 阅读 651 评论 0

摘要:本文主要向大家介绍了 C/C++知识点之C++并发编程 异步任务,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了 C/C++知识点之C++并发编程 异步任务,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

C/C++知识点之C++并发编程 异步任务

异步任务 std::async
(1) std::async 会返回一个 std::future 对象, 这个对象持有最终计算出来的结果. 当需要这个值时, 只需要调用对象的get()成员函数. 并且直到“期望”状态为就绪的情况下, 线程才会阻塞; 之后,返回计算结果. 

    std::future answer = std::async([] {
        std::stringstream stm;
        stm << "future id:" << std::this_thread::get_id() << std::endl;
        std::cout << stm.str();
        int sum = 0;
        for (int i = 1; i <= 100; i++)
        {
            sum += i;
            std::cout << i << " ";
        }
        std::cout << std::endl;
        std::this_thread::sleep_for(std::chrono::seconds(1));  // 增加延迟(1s)
        return sum;
    });
    std::stringstream stm;
    stm << "main id:" << std::this_thread::get_id() << std::endl;
    std::cout << stm.str();
    std::cout << "answer is: " << answer.get() << std::endl; // 此时会被阻塞, 直到异步任务返回
    std::cout << "tag 2" << std::endl;

 (2) std::async 允许通过添加额外的调用参数, 向函数传递额外的参数.       如果第一个参数是一个指向成员函数的指针, 第二个参数提供有这个函数成员类的具体对象(可以通过指针, 或者包装在 std::ref 中), 剩余的参数可作为成员函数的参数传入.      否则, 随后的所有参数将作为函数的参数, 或作为指定可调用对象的第一个参数. 比如 std::thread, 当参数为右值(rvalues)时, 拷贝操作将使用移动的方式转移原始数据. 这就允许使用“只移动”类型作为函数对象和参数.

    class XFun {
    public:
        XFun() {}
        ~XFun() {}

        void f(const std::string& str) {
            std::stringstream stm;
            stm << "f called. " << this << "-->" << str << std::endl;
            std::cout << stm.str();
        }
        std::string g(const std::string& str) {
            std::stringstream stm;
            stm << str << "[--> add by function g] " << this;
            return stm.str();
        }
        //XFun& operator=(const XFun&) = delete;
        //XFun(const XFun&) = delete;

        void operator()(const std::string& str) {
            std::stringstream stm;
            stm << "operator() called. " << this << "-->" << str << std::endl;
            std::cout << stm.str();
        }
    };
    XFun x;
    std::cout << "addr of x:" << &x << std::endl;
    std::async(&XFun::f, &x, std::string("test f()"));
    std::future f2 = std::async(&XFun::g, x, std::string("test g() temp")); // 创建一个 x 对象的副本传入, 删除赋值函数后, 将不能编译
    std::async(std::ref(x), std::string("test operator()"));
    std::async(XFun(), std::string("test operator() temp")); // 创建一个 XFun 的临时对象传入
    std::cout << f2.get() << std::endl;

 (3) 默认情况下, std::async 会启动一个新线程来完成任务, 但是也可以指定额外的执行方式:          std::launch::defered 指定等到 wait 或 get 被调用时才执行.          std::launch::async 指定必须到独立的线程中执行.          默认为: std::launch::defered | std::launch::async

    auto f3 = std::async(std::launch::deferred, [] {
        std::stringstream stm;
        stm << "f3 called. TID:" << std::this_thread::get_id() << std::endl;
        std::cout << stm.str();
    });
    auto f4 = std::async(std::launch::async, [] {
        std::stringstream stm;
        stm << "f4 called. TID:" << std::this_thread::get_id() << std::endl;
        std::cout << stm.str();
    });
    std::stringstream stm;
    stm << "main. TID:" << std::this_thread::get_id() << std::endl;
    std::cout << stm.str();
    std::this_thread::sleep_for(std::chrono::seconds(1));
    f3.wait();

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程