前一篇介绍的条件变量可以进行进程间通信,用来实现生产者/消费者模型。今天介绍的共享互斥量用来实现缓冲区读写模型,与生产者/消费者模型不同的地方是,消费者消费产品后,被消费的产品就不存在了,所以消费者线程也要互斥运行;而缓冲区读取线程读取数据后不删除数据,多个线程可以并行读取。这时使用条件变量也不合适了,就要使用共享互斥变量了。
共享互斥量,顾名思义,既共享,也互斥,读线程之间共享...
分类:
其他好文 时间:
2015-06-18 09:40:58
阅读次数:
190
生产者-消费者模问题/** * 使用阻塞队列实现生产者-消费者模型 * 阻塞队列只允许元素以FIFO的方式来访问 * @author Bingyue * */public class ProducerCustomerPattern { public static void main(String.....
分类:
其他好文 时间:
2015-06-16 12:26:56
阅读次数:
211
管道也叫无名管道,它是是 UNIX 系统 IPC(进程间通信) 的最古老形式,所有的 UNIX 系统都支持这种通信机制。
每个管道只有一个页面作为缓冲区,该页面是按照环形缓冲区的方式来使用的。这种访问方式是典型的“生产者——消费者”模型。当“生产者”进程有大量的数据需要写时,而且每当写满一个页面就需要进行睡眠等待,等待“消费者”从管道中读走一些数据,为其腾出一些空间。相应的,如果管道中没有可读数据,“消费者” 进程就要睡眠等待。...
分类:
系统相关 时间:
2015-06-02 13:29:43
阅读次数:
191
线程间协作的两种方式:wait、notify、notifyAll和Condition
在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作。比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权。因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让...
分类:
编程语言 时间:
2015-06-01 13:22:53
阅读次数:
222
线程并发的生产者-消费者模型:1.两个进程对同一个内存资源进行操作,一个是生产者,一个是消费者。2.生产者往共享内存资源填充数据,如果区域满,则等待消费者消费数据。3.消费者从共享内存资源取数据,如果区域空,则等待生产者填充数据。4.生产者的填充数据行为和消费者的消费数据行为不可在同一时间发生。下面...
对于多线程程序来说,不管任何编程语言,生产者消费者模型都是最经典的。
实际上,准确的说应该是“生产者-消费者-仓储”模型,离开了仓储,生产者消费者模型就显得没有说服力了。...
分类:
编程语言 时间:
2015-04-08 16:36:33
阅读次数:
158
今天上午,参加大摩的面试,自觉失败,记录一下过程。
面试官看着简历,并没有就简历提问,整个过程都在问java多线程的问题。
1. ReentrantLock,作为可重入锁,怎么理解“可重入”二字,有没有不可重复的锁?
我:获得对象锁的线程能够再次获得对象锁,访问对象……被鄙视了,后来想想,应该把递归这种场景说下;
2.生产者-消费者模型怎么实现?
我:使用synchronized或者Lo...
分类:
编程语言 时间:
2015-04-03 17:22:16
阅读次数:
246
wait()、notify()/*
* wait()、notify()
*
* 1.两个方法都只能在synchronized代码块中执行,因为要对持有锁的线程操作,只有同步中才有锁
* 2.两个方法在操作同步中的线程时,必须要标识所操作线程持有的对象锁
* 3.等待和唤醒必须是同一个对象锁
*/
public class Test05 {
public static void...
分类:
编程语言 时间:
2015-03-30 09:21:54
阅读次数:
208
回顾一下生产者消费者模型。 #include #include #include #include #include #include #include #define ERR_EXIT(m) \ do { \ perror(m);\ exit(EXIT_FAILURE);\ }while(0)
#...
分类:
系统相关 时间:
2015-03-16 16:15:52
阅读次数:
189