C++并发编程 异步任务

异步任务 std::async

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

    std::future<int> answer = std::async([] {
std::stringstream stm;
stm << "future id:" << std::this_thread::get_id() << std::endl;
std::cout << stm.str();
int sum = ;
for (int i = ; i <= ; i++)
{
sum += i;
std::cout << i << " ";
}
std::cout << std::endl;
std::this_thread::sleep_for(std::chrono::seconds()); // 增加延迟(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<std::string> 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());
f3.wait();

C++并发编程 异步任务的更多相关文章

  1. C++笔记-并发编程 异步任务(async)

    转自 https://www.cnblogs.com/diysoul/p/5937075.html 参考:https://zh.cppreference.com/w/cpp/thread/lock_g ...

  2. C# 并发编程 (异步编程与多线程)

    并发:同时做多件事情 多线程:并发的一种形式,它采用多个线程来执行程序. 并行处理:把正在执行的大量的任务分割成小块,分配给多个同时运行的线程.并行处理是多线程的一种,而多线程是并发的一种. 异步编程 ...

  3. python 并发编程 异步IO模型

    异步IO(Asynchronous I/O) Linux下的asynchronous IO其实用得不多,从内核2.6版本才开始引入.先看一下它的流程: 用户进程发起read操作之后,立刻就可以开始去做 ...

  4. [翻译]在 .NET Core 中的并发编程

    原文地址:http://www.dotnetcurry.com/dotnet/1360/concurrent-programming-dotnet-core 今天我们购买的每台电脑都有一个多核心的 C ...

  5. .NET Core 中的并发编程

    今天我们购买的每台电脑都有一个多核心的 CPU,允许它并行执行多个指令.操作系统通过将进程调度到不同的内核来发挥这个结构的优点. 然而,还可以通过异步 I/O 操作和并行处理来帮助我们提高单个应用程序 ...

  6. C++并发编程 互斥和同步

    C++并发编程 异步任务(async) 线程基本的互斥和同步工具类, 主要包括: std::mutex 类 std::recursive_mutex 类 std::timed_mutex 类 std: ...

  7. python 并发编程 io模型 目录

    python 并发编程 IO模型介绍 python 并发编程 socket 服务端 客户端 阻塞io行为 python 并发编程 阻塞IO模型 python 并发编程 非阻塞IO模型 python 并 ...

  8. Python并发编程之初识异步IO框架:asyncio 上篇(九)

    大家好,并发编程 进入第九篇. 通过前两节的铺垫(关于协程的使用),今天我们终于可以来介绍我们整个系列的重点 -- asyncio. asyncio是Python 3.4版本引入的标准库,直接内置了对 ...

  9. Python并发编程之实战异步IO框架:asyncio 下篇(十一)

    大家好,并发编程 进入第十一章. 前面两节,我们讲了协程中的单任务和多任务 这节我们将通过一个小实战,来对这些内容进行巩固. 在实战中,将会用到以下知识点: 多线程的基本使用 Queue消息队列的使用 ...

随机推荐

  1. selenium 图片上传方法。

    找到图片上传的input标签: 直接使用send_keys()传值 browser.find_element_by_class_name("upload-pic").send_ke ...

  2. hashlib模块使用详情

    python常用模块目录 一:hashlib简介 1.什么叫hash:hash是一种算法(不同的hash算法只是复杂度不一样)(3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224 ...

  3. AJAX学习2

    作者声明:本博客中所写的文章,都是博主自学过程的笔记,参考了很多的学习资料,学习资料和笔记会注明出处,所有的内容都以交流学习为主.有不正确的地方,欢迎批评指正. 本文学习内容:https://www. ...

  4. 我是IT小小鸟读书笔记

    阅读了我是IT小小鸟后发现,自己开发程序是真的很苦难的,在现在这个空对空的时期,我们学习到大部分的全都是理论知识,而没有真正的去进行实践.没有经过实践,我们在程序开发过程中也就无法发现自身的困难. 在 ...

  5. alpha冲刺(事后诸葛亮)

    [设想和目标] Q1:我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? "小葵日记"是为了解决18-30岁年轻用户在记录生活时希望得到一美体验友好 ...

  6. 树莓派两用优盘制作(FAT32存储+EXT树莓派系统)

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:树莓派两用优盘制作(FAT32存储+EXT树莓派系统)     本文地址:http://tec ...

  7. QUdpSocket-Qt使用Udp通讯实现服务端和客户端

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QUdpSocket-Qt使用Udp通讯实现服务端和客户端     本文地址:https:// ...

  8. 软工实践团队展示——WorldElite

    软工实践团队展示--WorldElite 本次作业链接 团队成员 031602636许舒玲(组长) 031602237吴杰婷 031602634吴志鸿 081600107傅滨 031602220雷博浩 ...

  9. javascript之容易出错的地方

    1: 不是所有的非空对象都有toString()方法的 var obj = Object.create(null); console.log(obj.toString());   // false; ...

  10. Java多线程编程(学习笔记)

    一.说明 周末抽空重新学习了下多线程,为了方便以后查阅,写下学习笔记. 有效利用多线程的关键是理解程序是并发执行而不是串行执行的.例如:程序中有两个子系统需要并发执行,这时候需要利用多线程编程. 通过 ...