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

上海哪家公司可以做网站自己画户型图的app

上海哪家公司可以做网站,自己画户型图的app,免费空间建站网站推荐,专业营销型网站建设公司互斥量(mutex)和条件变量(condition_variable)在多线程编程中通常是配合使用的,它们解决的是不同层面的问题。简单来说: 互斥量(mutex) 用于 互斥访问 共享资源,保证同一…

互斥量(mutex)和条件变量(condition_variable)在多线程编程中通常是配合使用的,它们解决的是不同层面的问题。简单来说:

  1. 互斥量(mutex 用于 互斥访问 共享资源,保证同一时间只有一个线程可以访问临界区,防止数据竞争。

  2. 条件变量(condition_variable 解决的是 线程同步 的问题,允许线程在特定条件满足前进入等待状态,并在条件满足时被通知唤醒。

为啥有了互斥量还需要 condition_variable

互斥量本身只能防止多个线程同时访问共享资源,但不能用于线程间的等待和通知机制。如果线程需要等待某个条件成立才能继续执行,仅靠互斥量会导致忙等待(不断轮询检查条件),这样会浪费 CPU 资源。而 condition_variable 可以让线程高效等待,避免资源浪费。

具体场景:

1. 没有 condition_variable 的情况(忙等待)
std::mutex mtx;
bool ready = false; // 共享资源的状态void worker() {while (true) {mtx.lock();if (ready) {std::cout << "Processing data..." << std::endl;mtx.unlock();break;}mtx.unlock();std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 轮询等待}
}

这里,worker 线程必须不断轮询 ready 变量是否变为 true,即使 ready 很长时间都不变,线程仍然会定期尝试获取互斥锁,导致 CPU 资源浪费。

2. 使用 condition_variable(高效等待)
std::mutex mtx;
std::condition_variable cv;
bool ready = false;void worker() {std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, [] { return ready; }); // 线程会在这里等待,直到 ready 变为 truestd::cout << "Processing data..." << std::endl;
}void producer() {std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟数据准备时间std::lock_guard<std::mutex> lock(mtx);ready = true;cv.notify_one(); // 唤醒等待的线程
}

在这个版本中,worker 线程会在 cv.wait()阻塞,直到 producer 线程调用 cv.notify_one(),线程才会被唤醒并继续执行。这种方式避免了 CPU 资源的浪费,提升了效率。

总结:

  • 互斥量 只负责保护数据的访问,不能用来通知其他线程状态的变化。
  • condition_variable 让线程可以高效等待某个条件,避免忙等待带来的性能浪费。
  • 它们通常配合使用,condition_variable 依赖 mutex 来保护共享数据的状态。

因此,即使有了互斥量,在需要线程同步的场景下,我们仍然需要 condition_variable 来高效地协调线程的执行顺序。

想象一个餐厅点餐的场景,我们用它来类比 mutexcondition_variable 的作用。


场景描述

在一个餐厅里:

  • 顾客点餐后需要等待厨师做好饭。
  • 厨师在顾客点餐之前是不会做饭的。
  • 顾客不能频繁去后厨查看饭是不是好了,否则会很麻烦。
  • 当饭做好后,厨师会通知顾客来取饭。

不用 condition_variable,仅用 mutex(忙等待的情况)

如果没有 condition_variable,顾客会不断去后厨查看饭是否好了:

std::mutex mtx;
bool food_ready = false; // 饭是否做好void customer() {while (true) { mtx.lock();if (food_ready) {std::cout << "顾客:拿到饭,开始吃!" << std::endl;mtx.unlock();break;}mtx.unlock();std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 轮询等待std::cout << "顾客:饭好了没?" << std::endl;}
}void chef() {std::this_thread::sleep_for(std::chrono::seconds(3)); // 模拟做饭时间mtx.lock();food_ready = true;std::cout << "厨师:饭做好了!" << std::endl;mtx.unlock();
}

问题:

  • 顾客不停地轮询后厨(忙等待),就像线程不断检查共享变量 food_ready,浪费 CPU 资源。
  • 这个过程即使饭还没好,顾客仍然会每隔一段时间就去“打扰”后厨(检查 food_ready 变量)。

使用 condition_variable(高效等待)

如果用 condition_variable,顾客可以安心等厨师通知,而不是不停地去检查。

std::mutex mtx;
std::condition_variable cv;
bool food_ready = false;void customer() {std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, [] { return food_ready; }); // 等待厨师通知std::cout << "顾客:拿到饭,开始吃!" << std::endl;
}void chef() {std::this_thread::sleep_for(std::chrono::seconds(3)); // 模拟做饭时间std::lock_guard<std::mutex> lock(mtx);food_ready = true;std::cout << "厨师:饭做好了!" << std::endl;cv.notify_one(); // 通知顾客饭已经好了
}

改进点:

  • 顾客不用一直去问饭好了没,而是安心等待,一旦厨师通知,顾客才去取饭。
  • 这个机制避免了不必要的 CPU 轮询,就像 cv.wait() 让线程休眠,直到 cv.notify_one() 叫醒它。

总结

方式现实类比编程效果
只用 mutex顾客不停地去厨房问“饭好了没?”线程不断检查变量(忙等待,浪费 CPU)
condition_variable + mutex顾客坐着等,厨师做好饭后叫他来取线程高效等待,不浪费资源

所以,互斥量(mutex)解决数据竞争问题,而 condition_variable 解决高效等待和线程同步的问题,它们是互补的


文章转载自:

http://fXwXrU0e.rrwgh.cn
http://mcFXByvv.rrwgh.cn
http://eADG2EhD.rrwgh.cn
http://0OspAmZq.rrwgh.cn
http://ZTayOyxh.rrwgh.cn
http://2Ru6rBC1.rrwgh.cn
http://8Jgi23vC.rrwgh.cn
http://InNveX6X.rrwgh.cn
http://CVv1SUV9.rrwgh.cn
http://qrtjMN3k.rrwgh.cn
http://0P6h5zex.rrwgh.cn
http://jTLmMvRy.rrwgh.cn
http://AAqAHa80.rrwgh.cn
http://BDtVrFSF.rrwgh.cn
http://4mv1tGFJ.rrwgh.cn
http://a2IAS854.rrwgh.cn
http://MBDWV1C5.rrwgh.cn
http://StTSLt75.rrwgh.cn
http://oeEdPd9j.rrwgh.cn
http://9Yrl4Xsd.rrwgh.cn
http://v3sM6IYz.rrwgh.cn
http://mdKoZNMQ.rrwgh.cn
http://VL6EzBt0.rrwgh.cn
http://Kh2OtNci.rrwgh.cn
http://3gmfS2Sl.rrwgh.cn
http://zk6QmmNH.rrwgh.cn
http://0mPYHRgS.rrwgh.cn
http://FWfIUvlR.rrwgh.cn
http://L5ruw85h.rrwgh.cn
http://MsSP29YE.rrwgh.cn
http://www.dtcms.com/wzjs/740625.html

相关文章:

  • 莱州教体局网站怎么在网络推广自己的产品
  • 建设银行租房网站湖北南安住房与城乡建设部网站
  • 不用建网站怎么做淘宝客vi设计案例网站
  • 南京网站开发就业培训课程姜堰区区网站建设
  • 宁国做网站的公司官网图片
  • wordpress不显示最新文章百度seo是啥意思
  • 创业网站怎么做的网上做室内设计好的网站
  • 重庆的电子商务网站linux 做网站用哪个版本
  • 摄影公司网站开发网站开发语言怎么样
  • 国际网站怎么注册免费的企业网站推广的方法有( )
  • 南昌网站建设多少钱可以做锚文本链接的网站
  • wordpress网站语言私域流量营销
  • 镇江专业网站建设制作专做农产品跨境的网站有
  • 重庆市建设工程信息网劳务资质查询网站怎么做外部优化
  • 网站使用费用网站美工要求
  • js代码 嵌入网站手机版网站seo怎么做
  • 网站如何修改后台密码凡客现在官网都找不到了
  • 表情包生成器在线制作网站中国建设局网站查询
  • 类似qq空间的网站网站建设过程中准备的工作
  • 网站左侧的导航是怎么做的怎么做网站站内搜索
  • 做星座网站wordpress中文购物主题
  • 天水 网站建设 招聘网站转化分析
  • 最漂亮网站上海网站建设穹拓
  • 合肥网站建站推广怎么将自己做的网站上线
  • 北京微信网站建设电话做钓鱼网站的公司
  • 建设银行忘记密码网站注册网站有什么用
  • 樟木头建网站的wordpress 云虚拟主机
  • 织梦网站字体大小山东菏泽建设银行网站
  • 网站建设技术服务税种分类seo技术优化技巧
  • php网站开发项目实战怎么做可以使网站跳转