C++并发编程 异步任务

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 = 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<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(1));
    f3.wait();
时间: 2024-08-27 10:47:04

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

[C#] C#并发编程-异步编程基础-报告进度

1 int ProgressRate = 0; 2 3 private async void btnProgress_Click(object sender, EventArgs e) 4 { 5 ProgressRate = 0; 6 7 var progress = new Progress<int>(); 8 9 //progress的进度改变 10 progress.ProgressChanged += (obj1, obj2) => 11 { 12 if (ProgressRa

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

原文地址:http://www.dotnetcurry.com/dotnet/1360/concurrent-programming-dotnet-core 今天我们购买的每台电脑都有一个多核心的 CPU,允许它并行执行多个指令.操作系统通过将进程调度到不同的内核来发挥这个结构的优点.然而,还可以通过异步 I/O 操作和并行处理来帮助我们提高单个应用程序的性能.在.NET Core中,任务 (tasks) 是并发编程的主要抽象表述,但还有其他支撑类可以使我们的工作更容易. 并发编程 - 异步 v

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

C++并发编程 异步任务(async) 线程基本的互斥和同步工具类, 主要包括: std::mutex 类 std::recursive_mutex 类 std::timed_mutex 类 std::recursive_timed_mutex 类 std::lock_guard 类型模板 std::unique_lock 类型模板 std::lock 函数模板 std::once_flag 类 std::call_once 函数模板 std::mutex 类 std::mutex 上锁须要调用

Python高级编程和异步IO并发编程

Python高级编程和异步IO并发编程网盘地址:https://pan.baidu.com/s/1eB-BsUacBRhKxh7qXwndMQ 密码: tgba备用地址(腾讯微云):https://share.weiyun.com/5Z3x9V0 密码:7cdnb2 针对Python高级编程和异步IO并发编程,把每个Python高级知识点从起因到原理讲透的课程全网难寻 第1章 课程简介第2章 python中一切皆对象第3章 魔法函数第4章 深入类和对象第5章 自定义序列类第6章 深入python

Python并发编程之学习异步IO框架:asyncio 中篇(十)

大家好,并发编程 进入第十章.好了,今天的内容其实还挺多的,我准备了三天,到今天才整理完毕.希望大家看完,有所收获的,能给小明一个赞.这就是对小明最大的鼓励了.为了更好地衔接这一节,我们先来回顾一下上一节的内容. 上一节「」,我们首先介绍了,如何创建一个协程对象.主要有两种方法 通过async关键字, 通过@asyncio.coroutine 装饰函数. 然后有了协程对象,就需要一个事件循环容器来运行我们的协程.其主要的步骤有如下几点: 将协程对象转为task任务对象 定义一个事件循环对象容器用

并发编程CAS

首先搞明白什么是并发编程? 并发编程是指在一台机器上同时处理多个任务.并发是指在同一个实体上的多个事件.多个事件在同一时间间隔发生. 为什么需要并发编程(多线程编程)? 有很多耗时的工作,如上传下载文件.与客户聊天需要建立长时间连接等.这时,一个线程是满足不了的,会因资源独占产生过多的等待 ,因此需要多线程编程. 如果使用并发来编写程序,当一个任务阻塞时,程序中的其他任务还可以继续执行,因此这个任务还可以继续保持向前执行. java的线程机制是抢占式的,这表示调度机制会周期性的中断线程,将上下文

python并发编程之多进程

python并发编程之多进程 一.什么是进程 进程:正在进行的一个过程或者一个任务,执行任务的是CPU. 原理:单核加多道技术 二.进程与程序的区别 进程是指程序的运行过程 需要强调的是:同一个程序执行两次是两个进程,比如打开暴风影音,虽然都是同一个软件,但是一个可以播放苍井空,另一个可以播放武藤兰. 三.并发与并行 无论是并行还是并发,在用户看来都是'同时'运行的,不管是进程还是线程,都只是一个任务而已,真是干活的是cpu,cpu来做这些任务,而一个cpu同一时刻只能执行一个任务. (1)并发

并发编程中的几个名词概念

现在,高并发,高流量已成为行业的热点,并且各种高并发的技术也是层出不穷,如论是官方文档还是市面上的各种书籍,我们在阅读的时候都会遇到一些专业名词,理解这些专业名词之后,才能更好的理解内容. 一.同步与异步 介绍: 同步和异步通常来形容一次方法调用. 解释一:同步方法调用一旦开始,调用者必须等到方法的调用返回后,才能继续后续的行为.异步方法调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者可以继续后续的操作. 解释二:同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信

《java并发编程实战》笔记(一)

最近在看<java并发编程实战>,希望自己有毅力把它读完. 线程本身有很多优势,比如可以发挥多处理器的强大能力.建模更加简单.简化异步事件的处理.使用户界面的相应更加灵敏,但是更多的需要程序猿面对的是安全性问题.看下面例子: public class UnsafeSequence { private int value; /*返回一个唯一的数值*/ public int getNext(){ return value++; } } UnsafeSequence的问题在于,如果执行时机不对,那么