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

图书馆门户网站建设方案衡水 网站建设

图书馆门户网站建设方案,衡水 网站建设,南京网站建设 雷仁网络,网站集约化建设工作打算先看几个问题,第三个问题可以先看代码然后再理解 Q1:临界区在哪 A1: 队列中元素在「生产者生产(push)」和「消费者消费(pop)」时就是临界区 Q2:同步操作在哪 A2: 很显然,队列只有…

先看几个问题,第三个问题可以先看代码然后再理解

Q1:临界区在哪

A1: 队列中元素在「生产者生产(push)」和「消费者消费(pop)」时就是临界区

Q2:同步操作在哪

A2: 很显然,队列只有在存在元素的前提下消费者才能消费,队列中元素满(假设有容量线程)时只有生产者是不能生产的,因此

  • 生产者队列满了就应该通知消费者消费
  • 消费者线程发现队列为空就需要通知生产者线程先生产物品

Q3:为什么消费者在 cv.wait(lck) 的条件是 while 而不是 if

A3: cv.wait(lock) 本质上是阻塞的,它会一直等待,直到接收到 notify 或 notify_all 的通知。但是,在某些情况下,虽然没有收到通知,但 cv.wait(lock) 可能会返回。这种情况被称为虚假唤醒(spurious wakeup)。

虚假唤醒是因为条件变量的实现方式,以及底层操作系统和硬件的影响。条件变量的实现通常依赖于底层的线程库和操作系统,它们可能在某些情况下引发虚假唤醒,这是一种难以避免的情况。

因此,为了编写健壮的多线程代码,通常建议使用循环来检查条件,就像在前面的示例中使用的 while (dataQueue.empty()) 一样。这样,即使发生虚假唤醒,线程也会再次检查条件,确保只有在条件满足时才继续执行。

总之,虽然 cv.wait(lock) 通常是阻塞的,但在多线程环境中,考虑到虚假唤醒是一种良好的编程实践,以确保正确性和可靠性。

总结来说就是 cv.wait(lock)可能会在某些情况下(如操作系统调度或硬件中断等)自行返回。因此,为了保险起见,应该在一个循环中检查条件,如示例中使用的 while (dataQueue.empty()),以防止虚假唤醒导致的错误行为

完整代码如下:

#include <iostream>
#include <queue>
#include <thread>
#include <memory>
#include <condition_variable>using namespace std;std::mutex mtx; // 互斥锁实现线程之间的互斥操作
std::condition_variable cv; // 条件变量实现线程之间通信操作class Queue {public:void put(int val) {unique_lock<std::mutex> lck(mtx);if (q.size() == 10) {// 生产者队列满了就应该通知消费者消费// 生产者线程应该进入 #1 等待状态,并且 #2 把 mtx 释放掉cv.wait(lck);}q.push(val);/*** @brief 通知所有线程 notify_all(),通知一个线程 notify_one()* 通知其他所有的线程,我生产了一个物品你们赶紧地去消费* 其他线程得到了该通知就会从等待状态 => 阻塞状态 => 获取互斥锁之后才能继续执行*/cv.notify_all();cout << "生产者 生产: " << val << "号物品\n";}void get() {unique_lock<std::mutex> lck(mtx);//!NOTE: 这里写成 while 是为了防止 cv.wait 被虚假唤醒while (q.empty()) {// 消费者线程发现队列为空就需要通知生产者线程先生产物品// #1 进入等待状态 #2 释放 mtxcv.wait(lck);}int val = q.front();q.pop();// 通知其他所有的线程,我消费了一个物品你们赶紧地去生产cv.notify_all();cout << "消费者 消费: " << val << "号物品\n";}private:queue<int> q;
};void producer(Queue *q)  // 生产者线程
{for (int i = 1; i <= 10; ++i) {q->put(i);std::this_thread::sleep_for(std::chrono::microseconds(100));}
}void consumer(Queue *q)  // 消费者线程
{for (int i = 1; i <= 10; ++i) {q->get();std::this_thread::sleep_for(std::chrono::microseconds(100));}
}int main() {Queue q;std::thread t1(producer, &q);std::thread t2(consumer, &q);t1.join();t2.join();return 0;
}

参考:

  • https://www.0xffffff.org/2016/02/11/38-c+±concurrency/
  • http://faq.0xffffff.org/question/2014/07/28/the-question-on-mutex-and-cond/

源码地址:链接

🔥 C++ 面试总结 CPPGuide 🔥

http://www.yayakq.cn/news/877251/

相关文章:

  • 企业网站设计素材wordpress数据表文档
  • 手提包 东莞网站建设传统营销
  • 网站后台管理 ftp网络营销方案毕业设计
  • 凡科免费建站宁波最新消息今天
  • 博星卓越 网站开发方案电脑上字体怎么到wordpress
  • 做网站能用ai好还是ps网站建设招标文件范本
  • 电影网站怎么做流量seo工程师招聘
  • 什么软件可以建网站建筑人才直聘网
  • 专业做包包的网站网页编辑的软件
  • 西安网站建设seo竞价住房和城乡建设部官网查证
  • 自己如何免费做网站公司做网站一般用什么域名
  • 企业官方网站建设的流程html好看的颜色代码
  • 企业网站备案需要室内设计网上教学
  • wordpress电影资源网站网站建设中首页模板下载
  • 一个简单的网站怎么做医院网站管理系统
  • 公司网站应该包括哪些内容网站优化 秦皇岛
  • 建设一个大型网站大概费用安卓手机建网站
  • 济南营销网站制作公司深圳建工建设集团有限公司
  • 郑州网站建设多少钱wordpress回到顶部
  • 溧水做网站价格宁波seo平台
  • 长宁做网站公司医院网站开发兼职
  • 关键词挖掘啊爱站网视频模板
  • 外卖网站 模板中国十大网络安全公司排名
  • 泰安高新区建设局网站初级网站开发的自我推荐
  • 网站买了服务器后该怎么做什么是可信网站认证
  • 在哪里查网站是什么时候建站自己做视频的网站吗
  • 建设一个网站需要多少钱采购网官网
  • ps上怎么做网站轮播图5G网站建设要多少个
  • 手机怎么登录自己做的网站毕业设计音乐网站开发背景
  • 创建网站的价格互联网创业项目排行榜