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

网站建设hbwnet百度关键词优化送网站

网站建设hbwnet,百度关键词优化送网站,修改wordpress 的权限,西安php网站制作Linux 操作系统:基于环形队列的生产者消费者模型 一、前言二、大致框架二、P操作、V操作三、生产者生产数据四、生产者获取数据五、代码测试六、所有代码 一、前言 环形队列采用数组模拟,用模运算来模拟环状特性。和基于阻塞队列的生产者消费者模型不同的…

Linux 操作系统:基于环形队列的生产者消费者模型

  • 一、前言
  • 二、大致框架
  • 二、P操作、V操作
  • 三、生产者生产数据
  • 四、生产者获取数据
  • 五、代码测试
  • 六、所有代码

一、前言

 环形队列采用数组模拟,用模运算来模拟环状特性。和基于阻塞队列的生产者消费者模型不同的是,环形队列将公共资源分成多份使用,而阻塞队列则是将公共资源当作一个整体使用!!
在这里插入图片描述

  • Linux OS:线程封装 | RAII封装锁 | 随机数运算任务封装

二、大致框架

 毫无疑问,我们首先需要一个数组来模拟环形队列,并且环形队列的大小也需指明!由于我们是将公共资源(即环形队列)分为多个小块单独使用,生产者向环形队列中插入数据,生产者向环形队列中取数据。这也意味着生产者和消费者的步数不一致,我们需要两个变量分别记录生产者和消费者的运动下标。

 对于生产者来说,空间是资源;对于消费者来所,数据是资源。并且生产者不能把消费者套一个圈(此时队列已经为满);消费者不能超越生产者(此时队列已经为空)。由于环形结构起始状态和结束状态都是一样的,不好判断为空或者为,所以我们引入两把计数器分别表示公共资源的个数,即信号量!!(初始时,生产者空间资源为整个数组,消费者数据资源为0)

 生产者消费者模型是多生产者多消费者间的消费模型。这也意味者可能存在多个生产者或多个消费者并发访问公共资源,会导致多执行流数据不一致问题!所以我们要为生产者和消费者各自维护一把锁!

【大致框架】:

const int defaultSize = 5; //环形队列大小默认值template <class T>
class RingQueue
{
public:RingQueue(int size = defaultSize): _size(size), _ringqueue(size), _p_step(0), _c_step(0){sem_init(&_data_sem, 0, 0);sem_init(&_space_sem, 0, size);pthread_mutex_init(&_mutex_p, nullptr);pthread_mutex_init(&_mutex_c, nullptr);}~RingQueue(){sem_destroy(&_data_sem);sem_destroy(&_space_sem);pthread_mutex_destroy(&_mutex_c);pthread_mutex_destroy(&_mutex_p);}private:std::vector<T> _ringqueue;int _size;int _p_step; // 生产者int _c_step; // 消费者sem_t _data_sem;  // 消费者使用sem_t _space_sem; // 生产者使用pthread_mutex_t _mutex_p; // 生产者使用pthread_mutex_t _mutex_c; // 消费者使用
};

二、P操作、V操作

 由于后续生产者和消费者都需要进行P(申请信号量)、V(释放信号量)。所以我们在这对PV进行封装!
【具体如下】:

 void P(sem_t &sem) // 申请信号量{sem_wait(&sem); // 等待信号量,等待成功会将信号量的值减1}void V(sem_t &sem) // 释放信号量{sem_post(&sem); // 发布信号量,表示资源使用完毕,可以归还资源了。将信号量值加1}

三、生产者生产数据

 生产者要想环形队列中插入数据,首先需要P操作申请空间资源。一旦申请成功,就意味着完成了对空间资源的预定。换而言之环形队列还未满,还可以继续插入数据。为了防止多生产并发访问环形队列,记下来就是申请锁了。

 只有两者都成功了,生产者才能向环形队列中Push数据。插入成功后,更新生产者步数下标即可!

【具体代码】:

void Push(T &in)
{P(_space_sem);{// LockGuard具体代码查看前言链接LockGuard lock(&_mutex_p);// RAII思想对锁进行了疯转,代替注释的显示加锁和解锁操作// pthread_mutex_lock(&_mutex_p);_ringqueue[_p_step] = in;_p_step++;_p_step %= _size;// pthread_mutex_unlock(&_mutex_p);}V(_data_sem);
}

四、生产者获取数据

 我们给Pop函数传递一个输出型参数,将生产者需要的数据带出!

 和消费行为一样,生产者首先需要生产空间资源(即空间信号量)、锁。然后将环形队列中的数据赋值个输出型产生,然后更新步数下标即可!

【具体代码】:

void Pop(T *out)
{P(_data_sem);{// LockGuard具体代码查看前言链接LockGuard lock(&_mutex_c);// RAII思想对锁进行了疯转,代替注释的显示加锁和解锁操作//  pthread_mutex_lock(&_mutex_c);*out = _ringqueue[_c_step];_c_step++;_c_step %= _size;// pthread_mutex_unlock(&_mutex_c);}V(_space_sem);
}

五、代码测试

 这里我们创建3个生产者和2个消费者。生产者插入的数据为2个随机数和随机运算符构造的任务Task;消费者直接获取任务执行!(消费者启动时先睡眠3秒,让生产者将环形队列填充满后在消费)
【具体代码】:

void *Productor(void *args)
{RingQueue<Task> *rq = static_cast<RingQueue<Task> *>(args);while(true){// sleep(1);int data_x = rand() % 10 + 1;usleep(1000);int data_y = rand() % 10 + 1;usleep(1000);char op = opers[rand() % opers.size()];Task t(data_x, data_y, op);rq->Push(t);std::cout << "Productor:" << t.PrintTask() << std::endl;}
}void *Consumer(void *args)
{sleep(3);RingQueue<Task> *rq = static_cast<RingQueue<Task> *>(args);while(true){sleep(1);Task t;rq->Pop(&t);t();std::cout << "Consumer: " << t.PrintResult() << std::endl;}
}int main()
{srand(time(nullptr) ^ pthread_self() ^ getpid());RingQueue<Task> rq;pthread_t p[3], c[2];pthread_create(&p[0], nullptr, Productor, &rq);pthread_create(&p[1], nullptr, Productor, &rq);pthread_create(&p[2], nullptr, Productor, &rq);pthread_create(&c[0], nullptr, Consumer, &rq);pthread_create(&c[1], nullptr, Consumer, &rq);pthread_join(p[0], nullptr);pthread_join(p[1], nullptr);pthread_join(p[2], nullptr);pthread_join(c[0], nullptr);pthread_join(c[1], nullptr);return 0;
}

【运行结果】:
请添加图片描述

六、所有代码

gitee:基于环形队列的生产者消费者模型

http://www.tj-hxxt.cn/news/82519.html

相关文章:

  • 青岛网站建设公司排名酒吧营销用什么软件找客源
  • 官方网站建设教程bittorrentkitty磁力猫
  • wordpress支付宝网页支付宝西安seo排名
  • 网站建设的内容厦门网站外包
  • 网站在建设中无法访问it培训班出来现状
  • 流量网站建设教程济南seo整站优化价格
  • h5类型的网站是怎么做的seo流量工具
  • wordpress 媒体库多选seo网站页面优化包含
  • p2p网站做牛北京百度竞价托管公司
  • 怎么制作ppt幻灯片搜索引擎优化的概念是什么
  • 网站扒皮下载后怎么做百度联盟怎么加入
  • 做企业网站项目市场调研的方法
  • 做自媒体的网站名字西安推广平台排行榜
  • 创世网站建设 优帮云精准引流推广公司
  • 中英日韩网站源代码域名注册信息查询whois
  • 温州网站建设技术托管品牌推广策划方案
  • 做外贸仿牌都用哪些网站软文推广文章
  • 网页游戏源代码宝鸡seo优化
  • 毕业设计网站建设网站运营推广方案
  • 的做网站公司搜狗收录提交入口网址
  • 网站建设 销售百度站长平台网页版
  • 国家安全文化建设网站怎么快速优化网站排名
  • 珠海网站制作哪家便宜上海网站排名优化怎么做
  • 专门做评测的网站游戏推广怎么做
  • 如何做网签合同 网站线上宣传推广方式
  • 网站为什么做优化ppt91永久海外地域网名
  • 傻瓜一键自助建站系统今日新闻最新消息大事
  • 阿里云ecs 搭建网站上海专业seo公司
  • 山西太原最新消息天津债务优化公司
  • 博星卓越营销网站设计it培训机构怎么样