在面向Windows系统的应用开发中,利用IO完成端口进行消息排队一直是处理多线程数据同步的一个有效武器,通过IO完成端口的消息队列机制,可以把各种不同的线程数据进行同步到最终的工作线程上,这样在工作线程上,只需要实现其具体的业务逻辑就可以了,不用关心任何与资源锁定等麻烦的操作,作为IO完成端口进行数据同步,其实是充分的利用了操作系统底层的缓存处理机制和内核的锁处理机制。工作线程只需要监听消息出口就可以了,系统会自动进行阻塞控制。
但是到了跨平台的调用时,尤其是脱离了Windows桌面操作系统,由于各种API 的限制,我们就没法利用系统层面提供的IO完成端口API,也无法利用其高效处理性。 既然消息队列机制,很有用,并且在很多类库中的处理思路上已经用到了该机制,为了跨平台操作的一致性,我们就需要引入一种实现IO完成端口实现消息队列的机制。
消息队列的设计思路是,利用一个有锁队列,进行消息的排队,利用信号量,进行消息处理信号通知,利用工作者线程,实现最终的业务逻辑调用出口,工作者线程内部,通过信号量进行阻塞等待或工作。
因为是模拟IOCP消息队列的实现,其效率也就无法保证有IOCP的效率高,影响效率的主要因素在于对消息缓冲队列的入队和出队锁定,因为此处的锁定是需要在内核态和用户态进行线程切换,实际测试中,如果不是在几百上千等高并发场合,其效率还可以,可以满足一般的业务需求。
初始设计是想利用CAS原语实现无锁队列,由于其编程模型变的异常复杂和将来CAS原语会不会随着编译器在CPU指令层面的调度更改的不确定性,因此放弃了CAS原语构造无锁队列。