前言

对于c/c++程序员来说,编写跨平台的多线程代码十分的麻烦,因为线程的创建,同步接口在windows/linux平台上差别非常大。好在c++11标准新增了线程库,终于可以编写跨平台的多线程代码了,现在我们就一起了解一下c++11新增了哪些线程相关的类。

std::thread – 创建线程

在创建thread变量的同时,可以传递线程函数所需参数,十分便捷。另外可以通过get_tid()获取线程的tid,通过join等待线程返回,通过detach将线程分离。

std::yield - 线程重调度

当线程在某些情况可以让出当前cpu时间片时,可以调用此函数,以提高其他线程的执行效率。

std::this_thread::sleep_for – 线程睡眠

此函数会阻塞当前线程,直到指定的睡眠时间到达。

std::mutex – 线程间互斥

std::mutex配合std::lock_guard,可以实现在某个作用域进入时自动加锁,退出时自动解锁,也可以手动调用lock/try_lock/unlock来手动控制锁的行为。

std::call_once – 单次调用

某些场景下,我们需要代码只被执行一次,比如单例类的初始化,考虑到多线程安全,需要进行加锁控制。C++11中提供的call_once可以很好的满足这种需求,实用又非常简单。

std::condition_variable – 条件变量

条件变量一般用于等待某个事件发生,需要配合互斥锁一起使用。c++11中没有提供信号量相关的类,需要等到c++20。

std::async +future – 异步运行任务

调用async异步开启一个新的线程执行某个任务,返回的future变量代表任务执行结果,当future.get()返回时,代表任务执行完毕,返回值即任务的返回值。

std::promise – 异步传值

除了在线程函数返回值以外,还可以通过promise对象来设定future对象的值。一个promise实例只能与一个future关联共享状态,当在同一个promise上反复调用get_future会抛出future_error异常。当promise对象调用set_value时,future对象的get即可返回对应值。

结语

以上这些类基本可以覆盖我们平时编写多线程业务逻辑的需求范围,接口简洁易懂,推荐大家使用。

c++ 异步下获取线程执行结果_【分享吧】C++11多线程库介绍相关推荐

  1. c++ 异步下获取线程执行结果_异步编排(CompletableFuture异步调用)

    1.问题背景 问题:当查询接口较复杂时候,数据的获取都需要远程调用,必然需要花费更多的时间. 假如查询文章详情页面,需要如下标注的时间才能完成: 那么,用户需要4s后才能统计的数据.很显然是不能接受的 ...

  2. c++ 异步下获取线程执行结果_这份阿里技术官强推的java线程池笔记,建议你看一下

    线程池 线程是宝贵的内存资源,单个线程占1MB空间,过多分配易造成内存溢出 频繁的创建及销毁线程会增加虚拟机回收频率.资源开销.造成程序性能下降 因此线程池出现了 线程池的概念 线程容器,可设定线程分 ...

  3. c++ 异步下获取线程执行结果_前端异步编程的那些事

    啊 一.异步编程的运行机制 我们学习Javascript语言的时候就知道它的执行环境是"单线程"的. 所谓"单线程",就是指一次只能处理一个任务.如果有多个任务 ...

  4. java 多线程,及获取线程执行结果

    2019独角兽企业重金招聘Python工程师标准>>> Thread.Runnable 创建多线程 new Thread(new Runnable() {public void ru ...

  5. jmeter 线程执行顺序_面试官让我说出8种线程顺序执行的方法!我懵了

    https://www.cnblogs.com/wenjunwei/p/10573289.html 一.前言 本文使用了8种方法实现在多线程中让线程按顺序运行的方法,涉及到多线程中许多常用的方法,不止 ...

  6. shell 获取命令执行结果_java高并发系列 第31天:获取线程执行结果,这6种方法你都知道?...

    这是java高并发系列第31篇. 环境:jdk1.8. java高并发系列已经学了不少东西了,本篇文章,我们用前面学的知识来实现一个需求: 在一个线程中需要获取其他线程的执行结果,能想到几种方式?各有 ...

  7. python 等待其他线程执行完_面试官:如何让线程顺序执行,join,还有其他办法吗?...

    面试官:如让线程顺序执行? 我:使用Thread的join方法. 面试官:除了join还有别的办法吗? 我:目前只用过join. 面试官:哦,那你了解CountDownLatch吗? 我:不了解,没使 ...

  8. Linux下获取线程TID的方法——gettid()

    如何获取进程的PID(process ID)? 可以使用: #include <unistd.h> pid_t getpid(void); 通过查看头文件说明,可以得到更详细的信息: fi ...

  9. java线程条件变量_使用条件变量(多线程笔记)

    条件变量属性: 使用条件变量可以以原子方式阻塞线程,知道某个特定条件为真为止.条件变量始终与互斥锁一起使用. 使用条件变量,线程可以以原子方式阻塞,知道满足某个条件为止.对掉件的测试时在互斥锁的保护下 ...

最新文章

  1. Kafka主题体系架构-复制、故障转移和并行处理
  2. /dev/tty /dev/ttyS0 /dev/tty0区别
  3. 华为擎云w510_苹果 iPhone 12 全家桶谍照曝光;华为台式机擎云W510现身官网
  4. 利用python爬虫(part1)--urllib.request模块
  5. 拥抱.NET Core系列:MemoryCache 缓存选项
  6. [小技巧][Java]Arrays.fill() 初始化 二维数组
  7. 信息学奥赛一本通(2053:【例3.3】三个数)
  8. 服务器端添加网站,服务器添加网站
  9. CSS去除按钮激活的高亮边框(Button的点击出现黑色外边框的取消)
  10. 牛皮啊!竟然可以为Dubbo接口生成文档了!
  11. 【字符串】【KMP模板--最小循环节总结】
  12. 10-Python-mapfilter
  13. 如何在右键新建中添加新建xmind文件
  14. 【硬石科技】电机系列教学(基于STM32)——舵机的控制
  15. storm启动报错,storm-ui界面显示不正常
  16. 三星手机微信下载的文件路径
  17. mac用u盘安装linux系统教程视频,教你如何用u盘重装mac系统教程
  18. CNCC2020丨5G边缘智能与智慧城市论坛
  19. 【Hive任务优化】—— Map、Reduce数量调整
  20. latex怎样让题号顶格_笔记本-latex写作问题集锦

热门文章

  1. django models索引_Django(生命周期、每部分详解、路由层)
  2. 高通固件解包IPQ6000固件解包
  3. ue linux转dos格式,uestudio中如何把dos格式转为unix
  4. python 3.4 vc++编译配置_VS2013+OpenCV3.4.2编译
  5. php编写一个学生类_Python零基础入门之编写测试实例
  6. python处理数据库_python操作数据库
  7. 网页脚本基本java语法_JSP 基础语法
  8. xshell怎么连接windows server_未能连接一个Windows服务 怎么回事
  9. nodejs png 转 rgb_90行代码,让微信登录界面的地球转起来
  10. 白名单模板_亚马逊品牌备案常见问题—— 白名单、IP加速器及品牌备案后无法使用A+...