c/c++ 多线程 等待一次性事件 std::promise用法

多线程 等待一次性事件 std::promise用法

背景:不是很明白,不知道为了解决什么业务场景,感觉std::async可以优雅的搞定一切的一次等待性事件,为什么还有个std::promise。

用法:和std::async一样,也能够返回std::future,通过调用get_future方法。也可以通过future得到线程的返回值。

特点:

1,是个模板类,模板类型是个方法类型,比如double(int),有一个参数,类型是int,返回值类型是double。

std::promise<int> pro;//pro.get_future.get()的返回值为int类型

2,在std::promise<T>的对象上,调用set_value后,future变成就绪(ready)状态,调用future对象的get方法的地方就由阻塞变为不阻塞了。

std::promise<int> pro;
pro.set_value(10);

3,作为线程的参数时,必须用std::move转成右值,否则编译不过。

void thread1(std::promise<int> p, int val){
  std::cout << "in thread1" << std::endl;
  p.set_value(val);
}

std::promise<int> pro;
std::future<int> ft1 = pro.get_future();
std::thread t1(thread1, std::move(pro), 10);
t1.detach();
std::cout << ft1.get() << std::endl;

4,std::promise的拷贝构造函数是被删除了的,所以std::packaged_task作为函数的参数时,必须用std::move(pro),把它转成右值引用。

代码:

#include <future>
#include <thread>
#include <iostream>

void thread1(std::promise<int> p, int val){
  std::cout << "in thread1" << std::endl;
  p.set_value(val);
}
int main(){
  std::promise<int> p;
  std::future<int> f = p.get_future();
  std::thread t1(thread1, std::move(p), 10);
  t1.detach();

  std::cout << f.get() << std::endl;
  pthread_exit(NULL);
}

github源代码

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

原文地址:https://www.cnblogs.com/xiaoshiwang/p/10016225.html

时间: 2024-10-07 06:28:19

c/c++ 多线程 等待一次性事件 std::promise用法的相关文章

c/c++ 多线程 等待一次性事件 异常处理

多线程 等待一次性事件 异常处理 背景:假设某个future在等待另一个线程结束,但是在被future等待的线程里发生了异常(throw一个异常A),这时怎么处理. 结果:假设发生了上面的场景,则在调用future的get方法时,就会得到被future等待的线程抛出的异常A. 3种情况: 1,std::async 2,std::packaged_task 3,std::promise,知道发生异常了,可以不调用set_value,而是调用set_exception(std::current_ex

c/c++ 多线程 等待一次性事件 packaged_task用法

多线程 等待一次性事件 packaged_task用法 背景:不是很明白,不知道为了解决什么业务场景,感觉std::asynck可以优雅的搞定一切,一次等待性事件,为什么还有个packaged_task. 用法:和std::async一样,也能够返回std::future,通过调用get_future方法.也可以通过future得到线程的返回值. 特点: 1,是个模板类,模板类型是个方法类型,比如double(int),有一个参数,类型是int,返回值类型是double. std::packag

[C++11 并发编程] 13 使用期望等待一次性事件

C++标准库使用期望(future)来支持一次性事件的等待.要等待某种一次性事件的线程可以获取一个代表该该事件的期望.这个线程可以每隔一段事件周期性的查询这个期望.此外,这个线程也可以继续做其它的处理,直到需要等待这个一次性事件才被挂起.通过期望还可以可以传递数据. C++标准库提供了两种期望unique future(std::future<>)和shared futures(std::shared_future<>),都声明在<future>库头文件中.std::f

同步并发操作之等待一次性事件

有时候需要用一些后台线程来完成计算,这些计算往往都是一次性的,线程计算完后便结束.这时候可以使用条件变量,但是有点浪费,我们只需要获取一次结果.C++标准库中有头文件<future>,很形象"未来",获取未来计算的结果. 使用std::async来启动一个异步任务.用std::future对象来存储异步任务返回的结果,这个对象存储结果.当我们需要结果时,只需调用get()方法.这时如果还没计算完毕,当前线程会阻塞. #include<future> #inclu

c/c++ 多线程 多个线程等待同一个线程的一次性事件

多线程 多个线程等待一个线程的一次性事件 背景:从多个线程访问同一个std::future,也就是多个线程都在等待同一个线程的结果,这时怎么处理. 办法:由于std::future只能被调用一次get方法,也就是只能被某一个线程等待(同步)一次,不支持被多个线程等待.所以std::sharted_future,就应运而生了. 特点:std::sharted_future可以被复制,std::future是不可以的被复制的. std::sharted_future的3种创建方式(fut为std::

C++11多线程——&lt;future&gt;之std::promise学习

一  <future>头文件简介 1 Classes std::future std::future_error std::packaged_task std::promise std::shared_future 2 Functions std::async std::future_category 二 std::promise类 1 std::promise class statement Template <class T> promise; Template <cla

多线程编程与事件

时间片的概念大家应该都了解过,windows为每个进程分配时间片,当一个程序的时间片结束时,就会轮到下一个程序执行,当轮流速度比较快的时候,就好像多个进程同时执行一样,这就是windows多任务的方式,本次介绍的多线程其实跟这个很像,只不过线程是在进程内又划分的更小的可执行单位,windows为每个线程分配时间片,当轮到某个进程的某个线程执行的时候,该线程才开始执行,就好像是进程间的多任务一样,线程依赖于进程,进程结束则线程必定结束,线程结束则进程不一定结束,线程就是一个进程中的某个可执行的模块

python3 中 Event.wait 多线程等待

python3 中 Event.wait 多线程等待 event.wait(time) 等待 time 时间后,执行下一步.或者在调用 event.set() 后立即执行下一步. event.clear()  清除信号 event.set() 设置信号 event.isSet() 判断是否设置信号 要求: 定义一个按钮,等待 3秒钟,如果 3秒钟没有再次被点击,则执行下一步.否则,重新等待 3秒. 定义执行函数 1 2 3 4 5 6 7 def demo():   event.set()   

C++11 std::function用法(c++常问问题十七)

C++11 std::function用法 直接上代码: 例子1:std::function的感觉就像是函数指针那样有木有 #include <iostream> #include <functional> #include <map> using namespace std; // 普通函数 int add(int i, int j) { return i + j; } //lambda表达式 auto mod = [](int i, int j){return i