月度归档:2011年12月

单生产者单消费者模型下的思考

多次遇到这种应用场景,一个生产者,消费者可能很多,但通过线程池的一层抽象可以简化到单消费者。项目中每次都涉及到生产者消费者的问题,都只能使用信号量加队列来处理。说实话,一直特别讨厌加锁,虽然书写过程中一对一对的看起来很优雅,但总觉得单生产者单消费者情况下应该能有一些特别的处理方式 .

多线程中的生产者消费者问题总是设计到锁的问题,信号量应该是最常用的实现了,毕竟他除了保证线程安全以外还直接能提供了阻塞这一功能。

普通队列在可以满足这些场景,但需要不停的分配空间且需要加锁;环形队列同样可以满足以上场景,不需要每次入队分配空间,但队列缓冲空间有限且同样需要加锁。

要摆脱以上问题,貌似套接字和管道成了另外一种解决方案,一端不停的发数据一端不停的处理数据。发送端和接收端都由自己处理,因此不用担心格式问题,唯一需要注意的就是生产者与消费者”生产”和”消费”数据的速率与管道和套接字缓存大小的关系。

匿名管道在buffer满或者套接字在发送缓冲满的时候,生产者一端会阻塞,通常的应用场景下这是不允许的。因此需要协调消费者的”处理”能力,当然后端如果使用线程池来异步”消费”,应该不会对缓存造成压力。