当前位置: 首页 > news >正文

[C++] 多线程编程-thread::yield()-sleep_for()

文章目录

  • std::this_thread::yield()
  • 和std::this_thread::sleep_for的不同
  • Reference

std::this_thread::yield()

应用场景:当该线程条件不满足,处于等待资源的状态的时候,我们希望他等待的时候不浪费CPU资源,那么应该这么处理。 (写线程池的时候,需要考虑的情况)

  • std::this_thread::yield() 的目的是避免一个线程(that should be used in a case where you are in a busy waiting state)频繁与其他线程争抢CPU时间片, 从而导致多线程处理性能下降.
    将停止当前线程的执行并优先考虑其他进程/线程(如果队列中还有其他进程/线程等待)。 线程的执行不会停止。(它只是释放CPU) ,具体过程就是将线程放到同级执行队列的后面,重新等待调度。例如,先进先出实时调度程序(Linux 中的 SCHED_FIFO)会挂起当前线程,并将其放在准备运行的相同优先级线程队列的后面(如果没有其他线程)线程具有相同的优先级,yield 没有效果)。
void function()
{while (True){if (!HasTask()){// we should use this_thread::yield() here.return;}// else// {//     // do work// }}
}
  • 如果条件不满足时,程序会立刻返回,然后立即与其他线程竞争CPU时间片, 结果就是此线程频繁的与其他线程争抢CPU时间片, 从而影响程序性能。而使用 std::this_thread::yield() 后, 就相当于”当前线程”检查条件不成功后, 将其未使用完的”CPU时间片”分享给其他线程使用, 等到其他线程用完后, 再和其他线程一起竞争(具体时间就是将线程放在队列后面,等待重新调度)。

源码参照: https://github.com/facebook/folly/blob/a3e8938068d849312e828da0ebb39973696cdcca/folly/synchronization/LifoSem.h#L427

/// Prevents blocking on this semaphore, causing all blocking wait()
/// calls to throw ShutdownSemError.  Both currently blocked wait() and
/// future calls to wait() for which tryWait() would return false will
/// cause an exception.  Calls to wait() for which the matching post()
/// has already occurred will proceed normally.
void shutdown() {// first set the shutdown bitauto h = head_->load(std::memory_order_acquire);while (!h.isShutdown()) {if (h.isLocked()) {std::this_thread::yield();h = head_->load(std::memory_order_acquire);continue;}if (head_->compare_exchange_strong(h, h.withShutdown())) {// successh = h.withShutdown();break;}// compare_exchange_strong rereads h, retry}...
}

和std::this_thread::sleep_for的不同

  • sleep_for: 线程调用该方法时,同样会让出CPU,并且休眠一段时间,从而让其他线程有机会运行。 等到休眠结束时,才参与CPU调度; 同时,yield也会释放cpu;并将线程放到同级别的线程队列的后面,等待执行,不会阻塞或者中断线程的执行。所以yield()方法让出CPU的时间是不确定的,并且以CPU调度时间片为单位。
  • sleep_for是堵塞线程,yield是重排线程时间片占用。
  • void sleep_for( const std::chrono::duration<Rep, Period>& sleep_duration ); 阻塞至少sleep_duration时间,由于调度或资源争用延迟,该函数可能会阻塞超过 sleep_duration 的时间。

Reference

  • https://en.cppreference.com/w/cpp/thread/yield
  • https://blog.csdn.net/liuhhaiffeng/article/details/52604052
  • https://stackoverflow.com/questions/11048946/stdthis-threadyield-vs-stdthis-threadsleep-for
  • https://blog.csdn.net/liuhhaiffeng/article/details/52604052
  • https://github.com/facebook/folly.git

相关文章:

  • 【开源】基于JAVA的人事管理系统
  • 国内首个openEuler师训营圆满结营!麒麟信安深化产教融合,助力培养国产操作系统高质量师资人才
  • SPN的重要性 | 保障服务安全和身份验证
  • 鸿蒙5.0发布时间已定!何处寻得移动开发加速器?
  • CWE、CVE
  • java中哈希家族底层原理
  • 扫码看文件效果怎么做?文件转成二维码能制作吗?
  • 写着玩的程序:pycharm实现无限弹窗程序(非病毒程序,仅整蛊使用)
  • PALWORLD linux centos7开服教程
  • 持续集成工具Jenkins的使用之安装篇(一)
  • vue和react的差异梳理
  • AWS认证SAA-C03每日一题
  • 【UE5】第一次尝试项目转插件(Plugin)的时候,无法编译
  • cad二次开发autolisp(一)
  • canvas绘制旋转的椭圆花
  • [LeetCode] Wiggle Sort
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • AHK 中 = 和 == 等比较运算符的用法
  • ERLANG 网工修炼笔记 ---- UDP
  • es6--symbol
  • ES6核心特性
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • java中具有继承关系的类及其对象初始化顺序
  • JS变量作用域
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • PHP 7 修改了什么呢 -- 2
  • 闭包--闭包作用之保存(一)
  • 聊聊sentinel的DegradeSlot
  • 前端临床手札——文件上传
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 算法系列——算法入门之递归分而治之思想的实现
  • 通过git安装npm私有模块
  • 我看到的前端
  • 线上 python http server profile 实践
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • Semaphore
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ​水经微图Web1.5.0版即将上线
  • #DBA杂记1
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (10)ATF MMU转换表
  • (Python) SOAP Web Service (HTTP POST)
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)springboot教学评价 毕业设计 641310
  • (力扣)循环队列的实现与详解(C语言)
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • *1 计算机基础和操作系统基础及几大协议