关于缓冲区

一直都想设计一个高效,线程安全,容易操作的缓冲区,基本思路是预分配内存,循环使用,使用互斥锁同步,在数据不足是读阻塞,空间不足时写阻塞。其实功能都很好实现,但是用起来总感觉很别扭,主要是阻塞的时候,会出现很多问题,细究起来逻辑还挺复杂,搞了好久,也没能设计一个让自己满意的缓冲区。

今天又费了半天劲,原来的问题虽然没有解决,但是产生了一些新的思路。其实缓冲区只是负责缓冲数据,没有必要设计的很复杂,实现传递数据的功能就够了,没有必要阻塞,数据不足就返回,空间不足也返回,具体怎么处理,这个逻辑交给调用层考虑。

简单的设计一下。让各个独立的线程模块或者是两个有联系的模块用事件通信,这个事件队列也用缓冲区实现(事件队列要仔细想想怎么设计),事件可以传递条件变量,这样,当缓冲区空间不足时,就可以直接返回,调用层会通过事件队列通知读取的线程,缓冲区中已经没空间可写了(之后阻塞),读的线程在主循环中读取事件,就可以在读出数据后,唤醒写线程。

其实,线程间通信的这些逻辑没有变的简单,只是被挪到了调用层,反正各个模块间的逻辑本来就很复杂,也不在乎加这么一点,但是这样一来,缓冲区就变得简洁高效了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值