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

权威的徐州网站建设网站开发需求网

权威的徐州网站建设,网站开发需求网,网络运维工程师有前途吗,外贸网站设计公司文章目录 多线程开发:wait、sleep、yield全解析1 What简要介绍详细介绍wait() — 条件等待(用于线程同步)sleep() — 睡觉,定时挂起yield() — 自愿让出 CPU 2 区别以及建议区别应用场景建议 3 三者协作使用示例 多线程开发&#…

文章目录

  • 多线程开发:wait、sleep、yield全解析
    • 1 What
      • 简要介绍
      • 详细介绍
        • `wait()` — 条件等待(用于线程同步)
        • `sleep()` — 睡觉,定时挂起
        • `yield()` — 自愿让出 CPU
    • 2 区别以及建议
      • 区别
      • 应用场景建议
    • 3 三者协作使用示例

多线程开发:wait、sleep、yield全解析

多线程开发中, wait()sleep()yield() 的正确使用对于控制线程行为、避免死锁、提升性能至关重要。


1 What

简要介绍

方法属于哪类是否释放锁作用
wait()同步原语(条件变量)✅ 释放锁当前线程等待某个条件满足,挂起执行。
sleep()时间控制❌ 不释放锁当前线程强制睡眠一段时间。
yield()调度建议❌ 不释放锁当前线程主动让出 CPU,允许其他线程执行。

详细介绍

wait() — 条件等待(用于线程同步)
  • std::condition_variable::wait()(C++11)
  • Java 的 Object.wait() 也类似

行为:

  • 线程在等待某个条件成立
  • 释放所持的互斥锁(mutex),进入阻塞状态。
  • 条件满足后,被 notify_one() / notify_all() 唤醒,重新竞争锁并继续执行。

C++ 示例:

std::mutex mtx;
std::condition_variable cv;
bool ready = false;void worker() {std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, []{ return ready; }); // 释放锁等待条件成立std::cout << "Condition met, working..." << std::endl;
}

sleep() — 睡觉,定时挂起
  • std::this_thread::sleep_for()
  • std::this_thread::sleep_until()

行为:

  • 当前线程被强制阻塞指定时间
  • 不会释放任何锁
  • 时间一到,线程进入就绪状态(可被调度)。

示例:

std::mutex mtx;void worker() {std::lock_guard<std::mutex> lock(mtx);std::this_thread::sleep_for(std::chrono::seconds(2));std::cout << "Wake up after 2 seconds.\n";
}

🔺 注意:如果你在持锁状态下调用 sleep(),会让其它线程“饿死”或引发死锁。


yield() — 自愿让出 CPU
  • std::this_thread::yield()(C++11)
  • 实际为对操作系统 sched_yield() 的封装

行为:

  • 当前线程主动放弃 CPU 时间片
  • 线程回到就绪队列,允许其他同优先级线程执行。
  • 不会阻塞、不休眠、不释放锁。

示例:

void busy_wait() {while (!ready) {std::this_thread::yield(); // 避免 CPU 忙等}
}

2 区别以及建议

区别

特性wait()sleep()yield()
阻塞线程?✅ 是✅ 是❌ 否(可能暂停)
是否释放锁?✅ 是(必须配合 mutex 使用)❌ 否❌ 否
唤醒条件notify_one() / notify_all()时间到被 OS 再次调度
典型用途线程间同步,条件等待限制频率、延时模拟忙等时避免 CPU 占用
所属 APIcondition_variable / pthread_condstd::this_thread::sleep_for()std::this_thread::yield()

应用场景建议

场景推荐方法
等待某个状态改变wait()
模拟延时 / 限速 / 轮询间隔sleep()
忙等 / 自旋等待中降低 CPU 占用yield()

3 三者协作使用示例

验证目标:

  • 主线程 sleep 控制节奏
  • 子线程 yield 等待任务
  • 条件变量 wait 同步工作

代码目标:

  • 主线程每 1 秒产生一个任务。
  • 工作线程使用 yield() 自旋检查是否有任务。
  • 一旦任务准备好,工作线程使用 wait() 等待条件变量通知,再执行任务。
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <atomic>
#include <chrono>std::mutex mtx;
std::condition_variable cv;
std::atomic<bool> ready{false};
int task_counter = 0;// 工作线程:等待任务并执行
void worker_thread() {while (true) {// ⏳ 自旋检查任务是否准备好(减少 wait 的频率)while (!ready.load()) {std::this_thread::yield(); // 主动让出 CPU}std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, [] { return ready.load(); }); // 等待通知,并释放锁// 模拟任务处理std::cout << "[Worker] Executing task #" << task_counter << std::endl;ready = false;  // 标记任务完成if (task_counter >= 5) break;  // 结束条件}
}// 主线程:周期性产生任务
void task_producer() {for (int i = 1; i <= 5; ++i) {std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟任务生成延迟{std::lock_guard<std::mutex> lock(mtx);task_counter = i;ready = true;std::cout << "[Main] Task #" << i << " ready\n";}cv.notify_one(); // 通知工作线程}
}int main() {std::thread worker(worker_thread);std::thread producer(task_producer);producer.join();worker.join();std::cout << "All tasks finished.\n";return 0;
}

输出:

[Main] Task #1 ready
[Worker] Executing task #1
[Main] Task #2 ready
[Worker] Executing task #2
[Main] Task #3 ready
[Worker] Executing task #3
[Main] Task #4 ready
[Worker] Executing task #4
[Main] Task #5 ready
[Worker] Executing task #5
All tasks finished.

代码行为解析:

  • 主线程:

    • 每秒产生一个任务,调用 sleep_for()
    • 使用锁保护 task_counterready 状态。
    • 调用 cv.notify_one() 唤醒工作线程。
  • 工作线程:

    • 使用 yield() 忙等(在任务未准备好前避免 CPU 占用)。
    • 使用 condition_variable::wait() 挂起,等待任务准备。
    • 被通知后执行任务,打印日志,重置状态。

文章转载自:

http://kWxq2ZAJ.zLbjx.cn
http://DFhHZj4J.zLbjx.cn
http://Otmosr9t.zLbjx.cn
http://gGSnacZA.zLbjx.cn
http://28raAMrV.zLbjx.cn
http://py44bGFv.zLbjx.cn
http://yncnJfcT.zLbjx.cn
http://HakSqN3w.zLbjx.cn
http://LSn7G3DK.zLbjx.cn
http://MT6pHT5k.zLbjx.cn
http://qJbOTcxO.zLbjx.cn
http://rtKrrlP2.zLbjx.cn
http://RtyZA9Du.zLbjx.cn
http://dTgp4mEE.zLbjx.cn
http://ppy8jyas.zLbjx.cn
http://Kz6zTGXo.zLbjx.cn
http://nvCqB3xo.zLbjx.cn
http://CUGaaPNj.zLbjx.cn
http://5CVifzfQ.zLbjx.cn
http://8IZxrEsY.zLbjx.cn
http://NGiZtN0N.zLbjx.cn
http://5s1LjwL1.zLbjx.cn
http://7BS9Vy0u.zLbjx.cn
http://A862FJVa.zLbjx.cn
http://JSLQacDH.zLbjx.cn
http://1LCcry9x.zLbjx.cn
http://ZwsYYzZh.zLbjx.cn
http://gV4AuTeV.zLbjx.cn
http://jY7ClwWC.zLbjx.cn
http://PcIYJhtG.zLbjx.cn
http://www.dtcms.com/wzjs/651173.html

相关文章:

  • 企业的网站建设费用佛山市seo网站设计哪家好
  • 个人作品展示 网站wordpress评论翻页
  • 南通模板建站定制哪个网站可以做视频软件
  • 网站美工主要工作是什么纵横网站
  • 建站公司网站用什么好响应式网站开发价格
  • 哪个网站做律师推广公关公司组织架构图
  • 宁波其它区低价企业网站搭建哪家好编程如何自学
  • h5网站建设 网站定制开发做网站推广有用吗
  • 装修公司做宣传在哪个网站企业建站系统cms
  • 北京网站制作公司报价网站建设服务器软件
  • 东莞化工网站建设做外贸怎么能上国外网站
  • 重庆网站排名推广手机网站做分享到朋友圈
  • 网站手机站怎么做的WordPress影视采集
  • 微官网 手机网站我想带货怎么找货源
  • 丹东做网站的网站竞价词怎么做
  • 网站备案验证码错误温州营销网站制作报价
  • 南阳河南网站建设价格门户网站的营销特点
  • 澄海建网站软件工程师报名官网
  • 做网站海报用什么app免费网站重生九零做商女
  • 易名中国域名门户网站住房和城乡建设部网站造价师
  • 苏州网站建设 苏州网络推广专家建立网站培训讲义
  • 番禺做网站费用昆山网站开发
  • 如何成立网站软件开发平台
  • 郑州营销型网站制作运营免费建自己的网站
  • 公司企业邮箱申请中山搜索引擎优化
  • 一流专业建设规划广州网站建设公司推荐乐云seo
  • 户外旅游网站模板wordpress 正文宽度
  • 长乐区建设局网站wordpress novelist
  • 学校如何重视校园网站建设自己做网站广告法
  • 燕郊医院网站建设佛山seo代理计费