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

时间:2022-08-03 20:22:46

本文地址:
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信号量,这是消费者将被阻塞。
这样双方都陷入了无休止的等待。