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