http://www.cnblogs.com/haippy/p/3279565.html

#include <iostream>     // std::cout
#include <future> // std::packaged_task, std::future
#include <chrono> // std::chrono::seconds
#include <thread> // std::thread, std::this_thread::sleep_for // count down taking a second for each value:
int countdown (int from, int to) {
for (int i=from; i!=to; --i) {
std::cout << i << '\n';
std::this_thread::sleep_for(std::chrono::seconds());
}
std::cout << "Finished!\n";
return from - to;
} int main ()
{
std::packaged_task<int(int,int)> task(countdown); // 设置 packaged_task
std::future<int> ret = task.get_future(); // 获得与 packaged_task 共享状态相关联的 future 对象. std::thread th(std::move(task), , ); //创建一个新线程完成计数任务. int value = ret.get(); // 等待任务完成并获取结果. std::cout << "The countdown lasted for " << value << " seconds.\n"; th.join();
return ;
}
#include <iostream>     // std::cout
#include <utility> // std::move
#include <future> // std::packaged_task, std::future
#include <thread> // std::thread int main ()
{
std::packaged_task<int(int)> foo; // 默认构造函数. // 使用 lambda 表达式初始化一个 packaged_task 对象.
std::packaged_task<int(int)> bar([](int x){return x*;}); foo = std::move(bar); // move-赋值操作,也是 C++11 中的新特性. // 获取与 packaged_task 共享状态相关联的 future 对象.
std::future<int> ret = foo.get_future(); std::thread(std::move(foo), ).detach(); // 产生线程,调用被包装的任务. int value = ret.get(); // 等待任务完成并获取结果.
std::cout << "The double of 10 is " << value << ".\n"; return ;
}

packaged_task 主要是包装一下函数,相当与函数指针,

直接就能够被线程调用。

它同时提供了一个同步的机制, .get_future()方法。

定义的future变量如 std::future<int>fut = tsk.getfuture();

通过fut.get()获得同步,也就是说,要等待执行结束,才执行下面的代码。 同时可以获得线程函数的返回值。

#include <iostream>     // std::cout
#include <utility> // std::move
#include <future> // std::packaged_task, std::future
#include <thread> // std::thread // a simple task:
int triple(int x) { return x * ; } int main()
{
std::packaged_task<int(int)> tsk(triple); // package task std::future<int> fut = tsk.get_future();
std::thread(std::ref(tsk), ).detach();
std::cout << "The triple of 100 is " << fut.get() << ".\n"; // re-use same task object:
tsk.reset();
fut = tsk.get_future();
std::thread(std::move(tsk), ).detach();
std::cout << "Thre triple of 200 is " << fut.get() << ".\n"; return ;
}

共享shared_future

#include <iostream>       // std::cout
#include <future> // std::async, std::future, std::shared_future int do_get_value() {
std::this_thread::sleep_for(std::chrono::seconds());
return ; } int main()
{
std::future<int> fut = std::async(do_get_value);
std::shared_future<int> shared_fut = fut.share(); // 共享的 future 对象可以被多次访问.
cout << "--1--" << endl;
std::cout << "value: " << shared_fut.get() << '\n';
cout << "--2--" << endl;
std::cout << "its double: " << shared_fut.get() * << '\n';
cout << "--3--" << endl;
return ;
}

最新文章

  1. ECF R9(632E) &amp; DP
  2. SQL SERVER特殊行转列案列一则
  3. volley中图片加载
  4. .NET同页面内用户控件与父页面以及控件之间方法调用
  5. 【C++】C++求vector中的最大最小值
  6. QWebView下载文件,QUrl中解析文件名
  7. 转!! Java中如何遍历Map对象的4种方法
  8. Java EE (14) -- SSH配置
  9. 微信 redirect_uri参数错误 正确的处理
  10. VM8下安装Mac OS X 10.7
  11. vecor预分配内存溢出2
  12. 网站开发常用jQuery插件总结(九)侧边栏插件pageslide
  13. vim note(3)
  14. Oracle12c中SQL性能优化(SQL TUNING)新特性之自动重优化(automatic reoptimization)
  15. 【Python3爬虫】斗鱼弹幕爬虫
  16. iis500错误分析
  17. NightWatch端到端测试
  18. 使用npm私有服务器保存公司内部强业务类型组件(二):vue-webpack框架
  19. Windows批处理命令用法
  20. vue的中vuex为何需要mutation更新状态,vue-router的路由的理解

热门文章

  1. LINUX SSH 建立密钥对
  2. (数据科学学习手札27)sklearn数据集分割方法汇总
  3. (数据科学学习手札23)决策树分类原理详解&amp;Python与R实现
  4. html页面导出word文档
  5. itop-4412开发板学习-内核信号量
  6. jenkins使用Role Strategy管理用户权限
  7. 【个人训练】(POJ1837)Balance
  8. (转)简述47种Shader Map的渲染原理与制作方法
  9. 装机、UEFI双系统安装
  10. Faster RCNN代码解析