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

购物网站功能介绍一流的高密网站建设

购物网站功能介绍,一流的高密网站建设,邯郸网址场,苏州网站建设方案外包生产者消费者模型 文章目录生产者消费者模型 [toc]一、 生产者消费者问题二、 问题分析三、 伪代码实现四、代码实现#xff08;C#xff09;五、 互斥锁与条件变量的使用比较一、 生产者消费者问题 生产者消费者问题#xff08;英语#xff1a;Producer-consumer problem[toc]一、 生产者消费者问题二、 问题分析三、 伪代码实现四、代码实现C五、 互斥锁与条件变量的使用比较 一、 生产者消费者问题 生产者消费者问题英语Producer-consumer problem也称有限缓冲问题英语Bounded-buffer problem是一个多线程同步问题的经典案例。该问题描述了共享固定大小缓冲区的两个线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中然后重复此过程。与此同时消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据消费者也不会在缓冲区中空时消耗数据。 . 要解决该问题就必须让生产者在缓冲区满时休眠要么干脆就放弃数据等到下次消费者消耗缓冲区中的数据的时候生产者才能被唤醒开始往缓冲区添加数据。同样也可以让消费者在缓冲区空时进入休眠等到生产者往缓冲区添加数据之后再唤醒消费者。通常采用进程间通信的方法解决该问题。如果解决方法不够完善则容易出现死锁的情况。出现死锁时两个线程都会陷入休眠等待对方唤醒自己。该问题也能被推广到多个生产者和消费者的情形。 二、 问题分析 该问题需要注意的几点 在缓冲区为空时消费者不能再进行消费在缓冲区为满时生产者不能再进行生产在一个线程进行生产或消费时其余线程不能再进行生产或消费等操作即保持线程间的同步注意条件变量与互斥锁的顺序 由于前两点原因因此需要保持线程间的同步即一个线程消费或生产完其他线程才能进行竞争CPU获得消费或生产的机会。对于这一点可以使用条件变量进行线程间的同步生产者线程在product之前需要wait直至获取自己所需的信号量之后才会进行product的操作同样对于消费者线程在consume之前需要wait直到没有线程在访问共享区缓冲区再进行consume的操作之后再解锁并唤醒其他可用阻塞线程。 在访问共享区资源时为避免多个线程同时访问资源造成混乱需要对共享资源加锁从而保证某一时刻只有一个线程在访问共享资源。 三、 伪代码实现 假设缓冲区大小为10生产者、消费者线程若干。生产者和消费者相互等效,只要缓冲池未满,生产者便可将消息送入缓冲池;只要缓冲池未空,消费者便可从缓冲池中取走一个消息。 items代表缓冲区已经使用的资源数spaces代表缓冲区可用资源数mutex代表互斥锁buf[10] 代表缓冲区其内容类型为itemin、out代表第一个资源和最后一个资源 var items 0, space 10, mutex 1; var in 0, out 0; item buf[10] { NULL };producer {while( true ) {wait( space ); // 等待缓冲区有空闲位置 在使用PV操作时条件变量需要在互斥锁之前wait( mutex ); // 保证在product时不会有其他线程访问缓冲区// productbuf.push( item, in ); // 将新资源放到buf[in]位置 in ( in 1 ) % 10;signal( mutex ); // 唤醒的顺序可以不同signal( items ); // 通知consumer缓冲区有资源可以取走} }consumer {while( true ) {wait( items ); // 等待缓冲区有资源可以使用wait( mutex ); // 保证在consume时不会有其他线程访问缓冲区// consumebuf.pop( out ); // 将buf[out]位置的的资源取走out ( out 1 ) % 10;signal( mutex ); // 唤醒的顺序可以不同signal( space ); // 通知缓冲区有空闲位置} }不能将线程里两个wait的顺序调换否则会出现死锁。例如(调换后)将consumer的两个wait调换在producer发出signal信号后如果producer线程此时再次获得运行机会执行完了wait(space)此时另一个consumer线程获得运行机会执行了 wait(mutex) 如果此时缓冲区为空那么consumer将会阻塞在wait(items)而producer也会因为无法获得锁的所有权所以阻塞在wait(mutex)这样两个线程都在阻塞也就造成了死锁。 四、代码实现C #include iostream #include string.h #include pthread.h #include unistd.h using namespace std;int current 0; // producer运行加1consumer运行减1 int buf[10]; int in 0, out 0; int items 0, spaces 10; bool flag; // 标记线程结束运行 pthread_mutex_t mutex PTHREAD_MUTEX_INITIALIZER; pthread_cond_t notfull PTHREAD_COND_INITIALIZER; // 缓冲区不满 pthread_cond_t notempty PTHREAD_COND_INITIALIZER; // 缓冲区不空void *producer( void *arg ) {while( flag ) {pthread_mutex_lock( mutex ); // 为保证条件变量不会因为多线程混乱所以先加锁while( !spaces ) { // 避免“惊群”效应避免因其他线程实现得到事件而导致该线程“假醒”pthread_cond_wait( notfull, mutex );}buf[in] current;in ( in 1 ) % 10;items;spaces--;printf( producer %zu , current %d\n, pthread_self(), current );for( int i 0; i 10; i ) {printf( %-4d, buf[i] );}printf( \n\n );pthread_cond_signal( notempty );pthread_mutex_unlock( mutex );}pthread_exit( NULL ); }void *consumer( void *arg ) {while( flag ) {pthread_mutex_lock( mutex );while( !items ) {pthread_cond_wait( notempty, mutex );}buf[out] -1;out ( out 1 ) % 10;current--;items--;spaces;printf( consumer %zu , current %d\n, pthread_self(), current );for( int i 0; i 10; i ) {printf( %-4d, buf[i] );}printf( \n\n );pthread_cond_signal( notfull );pthread_mutex_unlock( mutex );}pthread_exit( NULL ); }int main() {memset( buf, -1, sizeof(buf) );flag true;pthread_t pro[10], con[10];int i 0;for( int i 0; i 10; i ) {pthread_create( pro[i], NULL, producer, NULL );pthread_create( con[i], NULL, consumer, NULL );}sleep(1); // 让线程运行一秒flag false;for( int i 0; i 10; i ) {pthread_join( pro[i], NULL );pthread_join( con[i], NULL );}return 0; } 五、 互斥锁与条件变量的使用比较 我们会发现在伪代码中强调了条件变量在前互斥锁在后而到了代码实现时又变成了先加互斥锁再进行循环pthread_cond_wait()。这不是自相矛盾吗 其实在伪代码中的wait()、signal()就是操作系统中的PV操作而PV操作定义就保证了该语句是原子操作因此在wait条件变量改变的时候不会因为多进程同时访问共享资源造成混乱所以为了保证线程间的同步需要先加条件变量等事件可使用后才进行线程相应的操作此时互斥锁的作用是保证共享资源不会被其他线程访问。 而在代码实现中signal对应的时pthread_cond_wait()函数该函数在执行时会有三步 解开当前的锁等待条件变量达到所需要的状态再把之前解开的锁加锁 为了实现将pthread_cond_wait()变成原子操作就需要在该函数之前添加互斥锁。因为pthread_cond_wait()可以解锁也就不会发生像伪代码所说的死锁问题。相反如果像伪代码那样先使用条件变量后加锁则会造成多个线程同时访问共享资源的问题造成数据的混乱。 欢迎关注微信公众号不定时分享学习资料与学习笔记感谢
http://www.pierceye.com/news/695453/

相关文章:

  • 长沙正规网站建设价格网站推广怎么发外链
  • 专业版装修用什么网站做导航条深圳网站制作易捷网络
  • 哪个公司建设网站好手机网站维护费
  • 中山高端网站建设wordpress调用分类文章列表
  • 营销网站的专业性诊断评价和优化做视频网站需要什么资质
  • 河南广告制作公司网站西班牙语网站设计公司哪家好
  • 做业务一般要注册哪些网站wordpress prepare
  • wordpress 鼠标经过seo网站内容优化有哪些
  • 单页网站制作视频教程深圳有哪些软件外包公司
  • 嘉兴电子商务网站建设wordpress如何添加页面子目录
  • 教育在线网站怎样做直播seo网站推广怎样
  • 响应式的网站建设一个多少钱百度域名解析
  • 东莞做网站卓诚网络免费大数据分析网站
  • 网站用什么图片格式好seo学徒招聘
  • 地区网站建设网站用户反馈
  • 网站备案背景幕布下载成都最好的seo外包
  • 荆州 商务 网站建设郑州网站建设灵秀
  • 重庆市建筑工程信息官方网站注册号域名后如何建设公司网站
  • 江门网站建设junke100深圳小企业网站建设设计制作
  • 个人域名能做网站吗江苏外贸型网站制作
  • 文登区做网站的公司琴行网站开发学术论文
  • 嵌入式网站开发学习百度seo优化收费标准
  • 网站评价及优化分析报告湖南省邵阳建设局网站
  • 网站推广是做什么的深圳市住房建设与保障局官方网站
  • qq群推广网站lamp网站开发制作
  • ui网站界面设计广州省建设监理协会网站
  • 网站界面设计教程宁波正规网站seo公司
  • 网站建设与管理中专上海注册公司注册地址
  • 清溪网站建设怎么用wordpress打开网站
  • 网站稳定性不好的原因wordpress仿站维护