消息队列

创建时间:
2016-01-30 15:27
最近更新:
2018-11-06 11:13

Resource

  1. 什么是消息队列
  2. Linux 进程间通信 - 使用消息队列

用 双缓冲区 代替 队列

可以使用双缓冲区代替队列,理论上来说性能应该会更高,
写入线程 负责向 a缓冲区 写入数据,
读出线程 负责从 b缓冲区 读取数据 并 持久化到磁盘。
缓冲区的数据操作完成之后,就把 b缓冲区 清空,然后置换 a 跟 b,这样再继续读 a 里面的数据,b 再作为 写入缓冲区。

为何说 双缓冲区 会比 队列 的效率高呢?

使用队列:
工作线程写入日志 跟 消费线程读取日志 时,为了线程安全,二者都要加上类似线程锁的东西,保证只有一个线程在修改队列,也就是说,每次读或者写日志,都要用到线程锁,线程锁也是比较耗费资源的 (相对于不加线程锁)。

使用双缓冲区:
工作线程加上线程锁,把数据写入到缓冲区A,消费线程不需要锁 (因为只有一个消费线程来处理缓冲区 B 中的数据),这样就取消了工作线程跟消费线程互相排斥,他们可以同时工作,等到消费线程处理完缓冲区B的是数据的时候,我们给线程枷锁,然后把A和B互换,继续处理日志数据,这样就可以读写线程同步进行。

以上是个人 观点,我在自己的日志模块里面是按照这个思路来设计的,没有添加性能测试,所以只是理论上来说性能应该会比单个队列的要高一些。

-- C# 超高速高性能写日志