yield函数时c++11的新特性,它在std::this_thread::yield命名空间中实现,函数声明如下:

void yield() noexcept; 

其作用是当前线程“放弃”执行,让操作系统调度另一线程继续执行

比如说你的线程需要等待某个操作完成,如果你直接用一个循环不断判断这个操作是否完成就会使得这个线程占满CPU时间,这会造成资源浪费。这时候你可以判断一次操作是否完成,如果没有完成就调用yield交出时间片,过一会儿再来判断是否完成,这样这个线程占用CPU时间会大大减少。,例如:

while(!isDone()); // Bad
while(!isDone()) yield(); // Good

代码示例:

#include "stdafx.h"
#include <iostream>
#include <chrono>
#include <thread>
#include <atomic>
#include <mutex>std::mutex g_mutex;
std::atomic<bool> ready(false);void count1m(int id)
{while (!ready)// wait until main() sets ready... {             //若线程还有没创建的,将当前线程分配的cpu时间片,让调度器安排给其他线程,//由于使用了yield函数,在 not Ready 情况下,避免了空循环,在一定程度上,可以提高cpu的利用率std::this_thread::yield();}for ( int i = 0; i < 1000000; ++i) {}std::lock_guard<std::mutex> lock(g_mutex);std::cout << "thread : "<< id << std::endl;
}int main()
{std::thread threads[10];std::cout << "race of 10 threads that count to 1 million:\n";for (int i = 0; i < 10; ++i){threads[i] = std::thread(count1m, i);}ready = true;               // go!for (auto& th : threads){th.join();}std::cout << '\n';return 0;
}

运行结果:

参考资料:
yield - C++ Reference

c++11 yield函数的使用相关推荐

  1. yield( )函数的使用

    yield函数在并发编程中是非常重要的一个概念,尤其在多核计算机还不是那么普及的年代,要完成一个"并发"程序,是不得不借助yield函数的. 我们知道,yield的意思是" ...

  2. python中哪个函数能生成集合_神奇的python系列11:函数之生成器,列表推导式

    1.生成器 生成器的本质是迭代器. 在python中有三种方式来获取生成器 1.通过生成器函数 2.通过各种推到式来实现生成器 3.通过数据的转换也可以获取生成器 #函数 deffunc():prin ...

  3. c语言return 11,二级C语言教程章节测试11.对函数的进一步讨论

    一.选择题 (1)有以下程序 # include void f(char *s, char *t) { char k; k=*s; *s=*t; *t=k; s++; t--; if (*s) f(s ...

  4. 《BOOST程序库完全开发指南》 第11章 函数与回调

    第11章  函数回调 #include <iostream> #include <boost/assign.hpp> #include <boost/ref.hpp> ...

  5. PostgreSQL 10.1 手册_部分 IV. 客户端接口_第 33 章 libpq - C 库_33.11. 杂项函数

    33.11. 杂项函数 一如往常,总有一些函数不适合放在任何其他地方. PQfreemem 释放libpq分配的内存. void PQfreemem(void *ptr); 释放libpq分配的内存, ...

  6. Arduino ESP8266当中的yield 函数

    Arduino ESP8266当中的yield() 函数 在库函数中yield()函数相关代码: 通过VSCode PIO,我的文件位置在:C:\Users\Administrator\.platfo ...

  7. yield()函数的使用

    yield函数在并发编程中是非常重要的一个概念,尤其在多核计算机还不是那么普及的年代,要完成一个"并发"程序,是不得不借助yield函数的. 我们知道,yield的意思是" ...

  8. Linux0.11 execve函数(六)

    系列文章目录 Linux 0.11启动过程分析(一) Linux 0.11 fork 函数(二) Linux0.11 缺页处理(三) Linux0.11 根文件系统挂载(四) Linux0.11 文件 ...

  9. 11 虚函数【C++】

    11- 判断题 1-1 虚函数是用virtual 关键字说明的成员函数. T 1-2 动态绑定是在运行时选定调用的成员函数的. T 1-3 构造函数可以声明为虚函数.F 1-4 构造函数可以声明为纯虚 ...

最新文章

  1. python函数文档说明调用方式_Python 跨.py文件调用自定义函数说明
  2. JQuery环境配置
  3. JDK1.6官方下载
  4. struts2学习笔记(常见错误)
  5. SQL Server事务、视图和索引
  6. 计算机视觉可分计算成像学()五大类,中国大学 MOOC_化工过程与控制仿真实习_期末考试选修课答案...
  7. JavaScript 文件下载,二进制下载,文本下载的几种方式
  8. 小爱同学课程表自动导入教程(2)——新版青果教务系统
  9. Hadoop技术之Hadoop HA 机制详解
  10. IT人力外包越来越流行的原因剖析
  11. 【Java从零到架构师第③季】【项目实战】驾考管理系统
  12. BERT tokenization 处理英文句子 Wordpiece之后的处理技巧
  13. matlab学霸表白公式,学霸隐藏式表白数学公式
  14. 【TF2】Eager Execution机制
  15. 个推解读 | 各厂商推送消息分类新规出台,APP开发者必看
  16. 第四节课 hadoop总结
  17. Razor 视图引擎的一些属性和方法
  18. ssh海思3531a开发板的交叉编译
  19. doc与docx批量互转宏代码
  20. 玩法拆解:利用知乎引流引流,玩转外卖淘客CPS项目

热门文章

  1. VHDL交通灯控制器的设计
  2. 最大均值差异java_MATLAB最大均值差异(Maximum Mean Discrepancy)
  3. mongodb java set_MongoDB Java常用操作
  4. 基于roslyn的动态编译库Natasha
  5. QT + OpenCV + MinGW 在windows下配置开发环境
  6. Stop being a perfectionist
  7. mysql导入的时候提示“1046-No Database selected”的解决办法
  8. asp.net 能否多线程断点续传?
  9. 【转】浅析动态代理类实现过程
  10. 笔试:当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? ?(2nd)...