设为首页 收藏本站
查看: 910|回复: 0

[经验分享] Linux下用环形buf以及POSIX版本信号量解决生产者消费者问题

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-4-25 09:18:46 | 显示全部楼层 |阅读模式
一、Semaphore(信号量)
    Mutex变量是非0即1的,可看作一种资源的可用数量,初始化时Mutex是1,表示有一个可用资源, 加锁时获得该资源,将Mutex减到0,表示不再有可用资源,解锁时释放该资源,将Mutex重新加到1,表示又有了一个可用资源。
     信号量(Semaphore)和Mutex类似,表示可用资源的数量,和Mutex不同的是这个数量可以大于1。
即,如果信号量描述的资源数目是1时,此时的信号量和互斥锁相同!
本次使用的是POSIX semaphore库函数,这种信号量不仅可以于同一进程的线程间同步,也可以用于不同进程间的同步。
使用如下:
wKioL1cceRvBmhyAAAAZQGewxwU501.jpg
wKiom1cceFWg_zmrAAAitfUO9f4274.jpg
wKioL1cceRvTkNJ9AAAJA9mAj2w968.jpg
wKiom1cceFWyE3nMAAAKWIpsHgI023.jpg
semaphore变量的类型为sem_t,sem_init()初始化一个semaphore变量,value参数表示可用资源的数量,pshared参数为0表示信号量适用于同一进程的线程间同步。在使用完完semaphore变量之后应该调用sem_destroy()释放与semaphore相关的资源。
调用sem_wait()可以获得资源(P操作),使semaphore的值减1,如果调用sem_wait()时semaphore的值已 经是0,则挂起等待。如果不希望挂起等待,可以调用sem_trywait() 。调sem_post() 可以释放资源(V操作),使semaphore 的值加1,同时唤醒挂起等待的线程。
二、实现生产者--消费者问题
(1).本例中主要使用环形buf与信号量来实现单消费者,单生产者,其环形buf的实现主要用数组下标模环形buf的大小20。
对于生产者而言:不能在生产速度上把消费者套圈。
对于消费者而言:其消费速度不能超过生产者。
本例中主要实现:当生产者所需空格数为0,便挂起等待消费者消费 。当消费者消费数据为0,便挂起等待生产者生产。其生产者空格初始值为20,其消费者数据初始值为0。代码如下:

wKiom1cccKuACBHyAACbjUcnL9U442.jpg
wKioL1cccXKjLs3uAACMMy2hZr4931.jpg
wKiom1cccK2iIIdVAAAu-dpmQc0269.jpg
运行结果:
wKiom1cccK2TGThJAACzvfEJmvc520.jpg
(2).多生产者,多消费者,修改代码如下,需要分别对生产者,消费者加锁。
wKiom1ccdTGxrstcAABX9SVd9LY290.jpg
wKioL1ccdfiC3YctAABSNVxblyE024.jpg
运行结果如下:
wKiom1ccdTLCx_ViAACmMJwzN8k692.jpg
总结:对于多生产者多消费者,要在其信号量操作内加锁,而不在外部,因为信号量的操作是原子的。并且效率更高。
信号量不是加锁,主要是用来同步的。但是也可以用信号量操作实现加锁。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-208455-1-1.html 上篇帖子: linux下yum程序包管理及源码安装 下篇帖子: samba文件服务器安装与配置 消费者 生产者 Linux
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表