一直都想设计一个高效,线程安全,容易操作的缓冲区,基本思路是预分配内存,循环使用,使用互斥锁同步,在数据不足是读阻塞,空间不足时写阻塞。其实功能都很好实现,但是用起来总感觉很别扭,主要是阻塞的时候,会出现很多问题,细究起来逻辑还挺复杂,搞了好久,也没能设计一个让自己满意的缓冲区。
今天又费了半天劲,原来的问题虽然没有解决,但是产生了一些新的思路。其实缓冲区只是负责缓冲数据,没有必要设计的很复杂,实现传递数据的功能就够了,没有必要阻塞,数据不足就返回,空间不足也返回,具体怎么处理,这个逻辑交给调用层考虑。
简单的设计一下。让各个独立的线程模块或者是两个有联系的模块用事件通信,这个事件队列也用缓冲区实现(事件队列要仔细想想怎么设计),事件可以传递条件变量,这样,当缓冲区空间不足时,就可以直接返回,调用层会通过事件队列通知读取的线程,缓冲区中已经没空间可写了(之后阻塞),读的线程在主循环中读取事件,就可以在读出数据后,唤醒写线程。
其实,线程间通信的这些逻辑没有变的简单,只是被挪到了调用层,反正各个模块间的逻辑本来就很复杂,也不在乎加这么一点,但是这样一来,缓冲区就变得简洁高效了。