一种简单高效的生产者消费者多线程实现
2013-01-10 16:21
211 查看
一种简单高效的生产者消费者多线程实现
初衷
解决几个问题:主线程阻塞时间太长。
工作线程阻塞时间太长。
过多的同步代码导致结构复杂。
不能动态的调整工作线程数量。
实现方式
主线程有一个任务队列A,每个工作线程也有一个任务队列B。主线程中收到一个请求时,在队列A中添加任务。
主线程在循环中:
如果工作线程没有锁定队列B,那么主线程从队列A中取任务,放到队列B中,并唤醒工作线程。检查是否锁定使用
TryEnterCriticalSection(Windows)/
pthread_mutex_trylock(Linux)。
如果工作线程锁定了队列B,那么主线程跳过,避免主线程阻塞。
如果有已经完成的任务,则回调给请求者。任务完成通过状态变量检查,避免阻塞。
可以动态的添加、删除工作线程,删除时只要判断工作线程没有锁定自己的任务队列B即可。
工作线程:
处理整个队列B的任务。
完成的任务设置状态变量为完成,注意使用
Interlocked函数(Windows)/
__sync_add_and_fetch(Linux),避免工作线程阻塞。
然后睡眠,等待主线程唤醒。
这种实现有几个特点:
任务队列A不需要锁。
任务队列B需要锁,但不会阻塞主线程。
使用状态变量,简化线程同步操作,减少任务回调等待时间。
依赖于主线程的循环操作。
相关文章推荐
- ICE中的Monitor类:一种有趣的实现多线程之间、生产者与消费者的大体思路
- Java实现 简单的多线程“生产者-消费者”问题
- 多线程(生产者,消费者)的简单实现
- 用JAVA实现多线程(生产者与消费者问题)
- Java Note: 多线程的同步(互斥锁)的方法对比,信号量锁,读写锁的实现,生产者-消费者模式的实现
- Ruby简单的生产者,消费者模式的实现
- Java多线程 - 实现生产者与消费者模式
- Java多线程实现生产者消费者程序(Wait,Notify实现和Lock,Condition实现)
- 多线程模拟实现生产者/消费者模型
- JAVA实现多线程生产者消费者模型
- java多线程一 基本实现方法、消费者生产者队列、死锁
- 多线程模拟实现生产者/消费者模型
- Java多线程15:Queue、BlockingQueue以及利用BlockingQueue实现生产者/消费者模型
- 简单生产者消费者模型(java实现)
- Java多线程之——生产者、消费者简单实现
- 【Python之旅】第六篇(五):生产者消费者模型实现多线程异步交互
- 多线程实现消费者生产者的例子
- 生产者消费者的一种实现方式
- java多线程实现生产者与消费者
- java 多线程的生产者-消费者 实现