码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-11-25 20:39:52      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:函数的参数   删除   include   拷贝构造   右值   col   qq群   mis   pack   

多线程 等待一次性事件 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

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

标签:函数的参数   删除   include   拷贝构造   右值   col   qq群   mis   pack   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!