经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
c/c++ 多线程 等待一次性事件 std::promise用法
来源:cnblogs  作者:小石王  时间:2018/11/25 20:04:42  对本文有异议

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

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

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

特点:

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

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

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

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

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

  1. void thread1(std::promise<int> p, int val){
  2. std::cout << "in thread1" << std::endl;
  3. p.set_value(val);
  4. }
  5. std::promise<int> pro;
  6. std::future<int> ft1 = pro.get_future();
  7. std::thread t1(thread1, std::move(pro), 10);
  8. t1.detach();
  9. std::cout << ft1.get() << std::endl;

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

代码:

  1. #include <future>
  2. #include <thread>
  3. #include <iostream>
  4. void thread1(std::promise<int> p, int val){
  5. std::cout << "in thread1" << std::endl;
  6. p.set_value(val);
  7. }
  8. int main(){
  9. std::promise<int> p;
  10. std::future<int> f = p.get_future();
  11. std::thread t1(thread1, std::move(p), 10);
  12. t1.detach();
  13. std::cout << f.get() << std::endl;
  14. pthread_exit(NULL);
  15. }

github源代码

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

本人微信:xiaoshitou5854

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号