1、使用future

写一段简单的代码要同步另一个线程的数据

void thread1()
{//操作耗时//返回
}void main()
{thread th(thread1)wait 等待信号返回
}

以上是正常的操作,可以等待信号量释放返回,这时候是同步操作的,两个线程之间有等待的状态,std::future 同样会有等待的状态,不同的是:

1. std::future 操作相对简单,看不到信号量
2. 只要获取值会自动阻塞

以上两点这是c++11 相对于比较高级的地方。使用c++11 的future和 async 异步来包装函数。

2、源码测试

future 和 async,注意async的同步等待内部操作实际上是异步的。


#define _CRT_SECURE_NO_WARNINGS#include <cstdio>
#include <future>
#include <iostream>
#include <thread>
#include <chrono>
#include <string>
#include "c_time.h"typedef struct s_param
{std::promise<int> v_i;std::promise<std::string> v_str;
}s_param;std::string syncdata(std::string strin)
{std::this_thread::sleep_for(std::chrono::milliseconds(3000));//param.str_out = param.str_in+"out";return strin+"_out";
}int main() {std::promise<int> promiseObj;std::future<int> futureObj = promiseObj.get_future();s_param param;std::string s = "in";std::future<int> ff1 = param.v_i.get_future();std::future<std::string> ff2 = param.v_str.get_future();std::future<std::string> ff3 = std::async(std::launch::async, syncdata, s);std::thread th([&param](){std::this_thread::sleep_for(std::chrono::milliseconds(2000));param.v_i.set_value(100);std::this_thread::sleep_for(std::chrono::milliseconds(1000));param.v_str.set_value("test");});c_time2 t;std::cout << ff1.get() << std::endl;std::cout << ff2.get() << std::endl;std::cout << ff3.get() << std::endl;std::cout << t.get_us()<<" us" << std::endl;th.join();return 0;
}

输出,等待2秒后,输出100
等待1秒后,输出 test
直接输出 in_out 字符串

???为什么直接输出了in_out 字符串,我们在函数里面实际等待模拟耗时是3秒,这是因为前面ff1 和 ff2 耗时也是3秒左右,所以这一步异步操作早就开始了,ff1 和 ff2 是在线程th中操作,所以实际上,线程th { ff1=>2秒 ,ff2=>1秒 } 与 主线程 { ff3=>3秒 }, 在两个线程中几乎同时完成。
下载代码
代码里面给出了c_time2 的测试时间class

3、c++20 的co_yield 和

写一个插曲可以使用c++20 的co_yield 来做个实验,很强大,在vs里面调试,需要在c++ 命令里面加上 /await ,打开 协程命令,gcc版本需要在10 以上,并且加上fcorotine 编译,这是题外,如果没有c++20 编译器,c++11 起码我们手头是有的。

namespace stdexp = std::experimental;
stdexp::generator<int> gen(int count) {for (int i = 0; i < count; i++) {co_yield i;}
}int main_() {for (auto v : gen(10)) {printf("%d\n", v);}return 0;
}

c++11线程必须要懂得同步技术相关推荐

  1. Java并发——线程间通信与同步技术

    传统的线程间通信与同步技术为Object上的wait().notify().notifyAll()等方法,Java在显示锁上增加了Condition对象,该对象也可以实现线程间通信与同步.本文会介绍有 ...

  2. .Net线程同步技术解读

    C#开发者(面试者)都会遇到lock(Monitor),Mutex,Semaphore,SemaphoreSlim这四个与锁相关的C#类型,本文期望以最简洁明了的方式阐述四种对象的区别. 什么是线程安 ...

  3. 【总结】C# 线程同步技术(一)之 Join 方法

    最近工作闲暇之际,翻阅了以前保存的电子书<C#多线程编程手册>,发现此书同步技术这块写的甚好,于是参考此书并结合实例,对同步技术做一下总结和分析,也算是读书笔记与心得体会吧,并与大家分享. ...

  4. C++11 线程同步原语

    本文主要讲述C++11线程同步原语,以及使用场景. C++11 线程同步原语有三个:mutex(互斥锁),condition variable(条件变量)和semaphore(信号量). 一 mute ...

  5. c++11 线程:让你的多线程任务更轻松

    英文原文:C++ 11 Threading: Make your (multitasking) life easier 转载:http://www.oschina.net/translate/cplu ...

  6. C# 线程、任务和同步

    1,线程概述 线程是程序汇中独立的指令流.线程有一个优先级,实际上正在处理的程序的位置计数器,一个存储其局部变量的栈.每个线程都有自己的栈.但应用程序的内存和堆由一个进程的所有线程共享. 进程包含资源 ...

  7. AUTOSAR从入门到精通100讲(三十八)-通信网络中的⽐特和帧同步技术

    使⽤位和帧同步技术是为了确保从通信的⼀个发送器传输的信号可以被接收器正确解码.为了实现这⼀⽬标,必须将某些定时信息传递给接收器,例如通信数据的开始和结束位置.本⽂介绍了各种位和帧同步技术以及相应的底层 ...

  8. 6.OSI七层模型及交换机工作原理及VLAN(虚拟局域网)及VTP(vlan同步技术)

    交换机工作原理及VLAN(虚拟局域网) ❤OSI参考模型:从下往上,第一层是物理层 物理层:在设备之间传输比特流(以010101这样的二进制进行传输,以电信号的形式进行传输,0没有,1有) 物理层给线 ...

  9. 直扩同步的跟踪 matlab,基于FPGA的猝发式直扩载波同步技术研究与实现

    在高动态环境中,由于载波多普勒频移和收发端时钟漂移等因素的存在,直扩接收机必须通过载波同步才能在接收端消除频差并重构载波相位,以实现相干解调.在传统的载波同步技术中,锁频环具有较大的捕获带宽但频率跟踪 ...

最新文章

  1. 空空排错日志:OCS错误日志14501等解决办法
  2. 当法律纽带变成“机器红线”,能让自动驾驶汽车更安全吗?
  3. C# Label显示多行文本及换行(WinForm/WebForm)
  4. 【技术】交换机上如何对流量拦截
  5. java 组件 未显示出来_java – 自定义组件未显示
  6. [云炬创业学笔记]第三章商业创意的发掘与评估测试3
  7. HDU - 6982 J - Road Discount wqs二分 + 模型转换 + 优化
  8. 适用于孩子,父母和祖父母的JBoss HornetQ –第1章
  9. .net oracle 参数化,.NET参数化Oracle查询参数
  10. pytorch torch.nn.L1Loss
  11. Python的collections模块中namedtuple结构使用示例
  12. 去oracle过程,记一次Oracle数据恢复过程
  13. Xcode 添加 background modes、Associated Domains 等设置项
  14. 7. PHP Xhprof
  15. arcgis 只能查看指定行政区域_[教程】Arcgis进阶:统计分析
  16. 图片格式 tif转jpg 用Matlab实现
  17. Excel 如何提取单元格中的多个数值
  18. 如何优化关键词搜索排名(提升关键词排名的方法)
  19. 利用setenv进行tomcat 内存设置
  20. HyperLynx(三十一)高速串行总线仿真(三)

热门文章

  1. bitcoin 论文 Introduction
  2. linux判断文件是否为空,linux shell编程 如何判断一个文件是否为空
  3. linux系统vnc无法远程桌面,linux下vnc远程桌面连接方法分享
  4. java字符串拆分成数组_Java StringUtils字符串分割转数组的实现
  5. 线性独立路径_设计一个线性电源电路,需要准备哪些元器件呢?
  6. 阅文启动“2022全球作家孵化项目” 加速网络文学出海
  7. iPhone SE 3渲染图曝光:还是熟悉的味道
  8. Canalys:2021年第四季度苹果智能手机出货量占全球总量的22%
  9. 快手推出“一站式开放平台”:千亿流量5亿现金扶持经营伙伴
  10. 网络短视频内容审核趋严!短视频不得未经授权剪辑影视剧