c++11の异步方法 及线程间通信
1. std::promise 可以用来在线程间提供数据传递。
std::future = std::promise.get_future()。
线程中可以对promise赋值std::promise.set_value。
赋值之后std::future.get()就会返回其他线程中设置的值。
#include <iostream>
#include <future>
#include <chrono> std::promise<int> promis;
int main(int argc, const char * argv[]) {
std::future<int> fuResult = promis.get_future();
std::thread t([](){
std::this_thread::sleep_for(std::chrono::seconds());
promis.set_value();
});
t.detach();
std::cout<<"detach..."<<std::endl;
std::cout<<fuResult.get()<<std::endl;
return ;
}
#include "stdafx.h"
#include <iostream>
#include <future>
#include <chrono>
#include <string> std::promise<std::string> promis;
int main()
{
std::future<std::string> fuResult = promis.get_future(); auto t_cb=[]()
{
std::cout << "subThread start!"<<std::endl;
std::chrono::milliseconds dur();
std::this_thread::sleep_for(dur);
promis.set_value("value from subThread");
}; std::thread t(t_cb);
t.detach();
std::cout << "detach..." << std::endl;
std::cout << fuResult.get() << std::endl; getchar();
return ;
}

2. std::packaged_task 可以包裹一个函数, 有点类似std::function,不同之处在于这个可以通过get_future返回std::future对象来获取异步执行的函数结果。
#include "stdafx.h"
#include <iostream>
#include <future>
#include <chrono>
#include <string> int main()
{
std::packaged_task<int()> task([]()
{
std::cout << "packaged_task start!"<<std::endl;
std::chrono::milliseconds dur();
std::this_thread::sleep_for(dur);
return ;
});
std::future<int> fuResult = task.get_future();
std::thread t_task(std::move(task));
t_task.detach();
std::cout << "detach..." << std::endl;
std::cout << fuResult.get() << std::endl;
getchar();
return ;
}

3. std::async提供异步执行的方法,std::future = std::async(...), 函数执行完成后可以通过std::future.get()获取到执行函数的返回值。
#include <iostream>
#include <future>
#include <chrono> int main(int argc, const char * argv[])
{
std::future<int> fuResult = std::async([]()
{
std::this_thread::sleep_for(std::chrono::seconds());
return ;
});
std::cout<<"detach..."<<std::endl;
std::cout<<fuResult.get()<<std::endl;
return ;
}
c++11の异步方法 及线程间通信的更多相关文章
- Java多线程编程核心技术---线程间通信(一)
线程是操作系统中独立的个体,但这些个体如果不经过特殊处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一.线程间通信可以使系统之间的交互性更强大,在大大提高CPU利用率的同时还会使程序员对各 ...
- Java笔记(二十)……线程间通信
概述 当需要多线程配合完成一项任务时,往往需要用到线程间通信,以确保任务的稳步快速运行 相关语句 wait():挂起线程,释放锁,相当于自动放弃了执行权限 notify():唤醒wait等待队列里的第 ...
- Java线程间通信-回调的实现方式
Java线程间通信-回调的实现方式 Java线程间通信是非常复杂的问题的.线程间通信问题本质上是如何将与线程相关的变量或者对象传递给别的线程,从而实现交互. 比如举一个简单例子,有一个多线程的 ...
- Java多线程:线程间通信之Lock
Java 5 之后,Java在内置关键字sychronized的基础上又增加了一个新的处理锁的方式,Lock类. 由于在Java线程间通信:volatile与sychronized中,我们已经详细的了 ...
- Java 里如何实现线程间通信
正常情况下,每个子线程完成各自的任务就可以结束了.不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了. 本文涉及到的知识点:thread.join(), object.w ...
- Java多线程编程(三)线程间通信
线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时 ...
- Java多线程编程核心技术-第3章-线程间通信-读书笔记
第 3 章 线程间通信 线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大 ...
- Net线程间通信的异步机制
线程间通信 我们看下面的图 我们来看线程间通信的原理:线程(Thread B)和线程(Thread A)通信, 首先线程A 必须实现同步上下文对象(Synchronization Context), ...
- 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题
调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...
随机推荐
- VueJs开发笔记—IDE选择和优化、框架特性、数据调用、路由选项及使用
一.IDE的选择: VsCode和WebStorm都是不错的选择,说一下两者的优缺点,调试便捷性来说两者不相上下. WebStorm缺点:性能方面VsCode远好于WebStorm: WebStorm ...
- Django组件之Middleware
一.中间件 在django的settings.py文件下,有一个变量为MIDDLEWARE,里面放的就是中间件. MIDDLEWARE = [ 'django.middleware.security. ...
- C#基础知识回顾-- 属性与字段
今天在公交车上,突然想属性和字段到底有什么区别?很多字段属性都存在 get{}和set{} 和普通的变量没什么区别(可读可写) 我就感觉属性就是给字段一个多的选择方式,有的字段是不允许更改的.. 刚写 ...
- C#添加IIS站点
利用IIS7自带类库管理IIS现在变的更强大更方便,而完全可以不需要用DirecotryEntry这个类了(乐博网中很多.net管理iis6.0的文章都用到了DirecotryEntry这个类 ),M ...
- 将第三方包安装到maven本地仓库
今天在做jasper report生成pdf文档的时候,需要引入亚洲字体jar包.maven仓库是有这个jar包,但是在项目pom文件始终不能下载.无奈只有将jar包安装到maven本地仓库. 1 将 ...
- API接口规范V1.0——制定好规范,才好合作开发
返回码规范: 统一六位 000000 表示成功! 参数相关返回码预留100000-199999:系统相关返回码预留200000-299999:数据中心310000-319999后续项目以此类推,后续根 ...
- hive的本地安装部署,元数据存储到mysql中
要想使用Hive先要有hadoop集群的支持,使用本地把元数据存储在mysql中. mysql要可以远程连接: 可以设置user表,把localhost改为%,所有可连接.记住删除root其他用户,不 ...
- win10系统彻底卸载Mysql
本文介绍,在Windows10系统下,如何彻底删除卸载MySQL... 1>停止MySQL服务 开始->所有应用->Windows管理工具->服务,将MySQL服务停止. 2& ...
- 【代码笔记】Web-HTML-链接
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- java Name [jdbc/myjavadb] is not bound in this Context. Unable to find [jdbc].
一.出错时的情况: 首先,这是一个servlet项目 1.项目的web.xml配置了:(后来发现不配置这个也行,但是tomcat一定要配置) <resource-ref> <desc ...