【读书笔记】线程安全消息队列设计思路
2014-10-15 15:37
155 查看
一.
最容易想到的方式就是队列本身就是一个stl的list,向队列中加入消息或从队列中提取消息时就操作这个list,单个操作过程使用同步锁。
缺点:频繁的锁竞争使得性能很差
二.
维护一个存放若干list的容器,为list设置数量上限
当某个线程需要向队列中添加新消息时,从容器中取一个空list并持有,直到存满,将list放回容器,再取空list
当逻辑线程需要从队列中提取消息时,从容器这种取一个非空的list,读出全部消息后放回容器
操作容器的过程需要使用同步锁
缺点:在子list没有被存满时,其中的消息不能被读取
优点:
减少了锁竞争
可以接受多个不同线程投递消息
三.
维护两个list,一个供逻辑线程读,另一个供I/O线程写。
当逻辑线程读完后,两个list互换,互换时加锁
I/O线程每次写入时加锁(虽然加锁次数较多,但只有在遭遇list对调时才会阻塞)
逻辑线程读取时不需要加锁
缺点:只能支持一个I/O线程对应一个逻辑线程
最容易想到的方式就是队列本身就是一个stl的list,向队列中加入消息或从队列中提取消息时就操作这个list,单个操作过程使用同步锁。
缺点:频繁的锁竞争使得性能很差
二.
维护一个存放若干list的容器,为list设置数量上限
当某个线程需要向队列中添加新消息时,从容器中取一个空list并持有,直到存满,将list放回容器,再取空list
当逻辑线程需要从队列中提取消息时,从容器这种取一个非空的list,读出全部消息后放回容器
操作容器的过程需要使用同步锁
缺点:在子list没有被存满时,其中的消息不能被读取
优点:
减少了锁竞争
可以接受多个不同线程投递消息
三.
维护两个list,一个供逻辑线程读,另一个供I/O线程写。
当逻辑线程读完后,两个list互换,互换时加锁
I/O线程每次写入时加锁(虽然加锁次数较多,但只有在遭遇list对调时才会阻塞)
逻辑线程读取时不需要加锁
缺点:只能支持一个I/O线程对应一个逻辑线程
相关文章推荐
- ENode 1.0 - 消息队列的设计思路
- enode框架step by step之消息队列的设计思路
- ENode 1.0 - 消息队列的设计思路
- 消息的重试机制的设计思路
- 分布式消息队列的设计和使用
- 分布式消息队列的设计和使用
- 消息队列的设计与实现
- State设计模式 msmq消息队列
- ENode 1.0 - 消息的重试机制的设计思路
- 关于消息队列这种设计模式的利弊
- zz[C++]合理的设计和使用消息队列
- 应用框架的设计与实现——.NET平台(9 消息队列产品安装)
- 多线程消息队列框架的设计(很好很实用的设计思想)
- 用STL设计消息队列、优先级消息队列、资源分配管理器
- 《linux程序设计》--读书笔记--第十四章信号量、共享内存和消息队列
- 消息队列的设计
- 读书笔记SendMessage需要投递到消息队列吗(转)
- /LGC设计模式/消息队列的设计与实现
- [C++]合理的设计和使用消息队列