进程同步问题-生产者消费者问题(linux semaphore实现)

来源:互联网 发布:为提高淘宝销量 编辑:程序博客网 时间:2024/05/12 15:39

本文地址:
http://blog.csdn.net/qq_26437925/article/details/52638582

源代码地址(通过ubuntu14.04 32bit 测试):
https://github.com/doctording/clib/tree/master/thread/producer_consumer


学习目标:

  • linux 线程
  • linux 信号(Semaphore)的使用
  • makefile书写
  • 生产者,消费者问题理解

原文参考
csdn博客专家:MoreWindows
秒杀多线程第十篇 生产者消费者问题
http://blog.csdn.net/lisonglisonglisong/article/details/45390227

linux ftok()函数
http://www.cnblogs.com/joeblackzqq/archive/2011/05/31/2065161.html

图书参考
《unix环境高级编程》/ APUE


在源代码基础上写改了下,是能够在本机上运行,并且编写了makefile文件。
semaphore 的semget,semctl,semop这几个函数要重点观察


生产者消费者问题进程描述

semaphore mutex=1; //临界区互斥信号量semaphore empty=n;  //空闲缓冲区semaphore full=0;  //缓冲区初始化为空producer () { //生产者进程    while(1){        produce an item in nextp;  //生产数据        P(empty);  //获取空缓冲区单元        P(mutex);  //进入临界区.        add nextp to buffer;  //将数据放入缓冲区        V(mutex);  //离开临界区,释放互斥信号量        V(full);  //满缓冲区数加1    }}consumer () {  //消费者进程    while(1){        P(full);  //获取满缓冲区单元        P(mutex);  // 进入临界区        remove an item from buffer;  //从缓冲区中取出数据        V (mutex);  //离开临界区,释放互斥信号量        V (empty) ;  //空缓冲区数加1        consume the item;  //消费数据    }}

注意:生产者先 p(mutex) , 再 p(empty), 消费者先p(metux) 再p(full) 不可行

当生产者进程已经放满缓冲区时,消费者没有取产品即empty=0, 当下次仍然是生产者进程运行时
他先执行p(mutex)封锁信号量,在执行p(empty)时被阻塞,希望消费者取出产品后 将其唤醒。
轮到消费者进程运行时,先p(metux) 而生产者已经封锁了mutex信号量,这是消费者将被阻塞。
这样双方都陷入了无休止的等待。

0 0
原创粉丝点击