多线程压缩程序的设计

假定:希望有 num_threads 个工作线程,每个线程负责压缩 recordsize 大的数据,最后按输入的顺序输出一个输出流。

在负责压缩的工作线程(作为consumer)之外,有一个线程负责I/O(作为producer),具体来说:

I/O线程(主线程):

启动时,分配 num_threads+1 个 recordsize 的输入缓冲区[1],放到一个队列 free_queue 中。输出流对应的输入记录起始指针 out_input_next_offset = 0。

启动 num_threads 个工作线程。

(循环:

如果 free_queue 不为空,且文件尚未结束,则从其中取出一个缓冲区,从输入流中读入数据,然后将缓冲区放到 work_queue 中,并唤醒一个等待 work_queue 的工作线程,直到 free_queue 为空为止。

检查输出树(按输出缓冲区的起始地址为键的RBtree)的最小节点,如果存在且与上次 out_input_next_offset 相同则输出该最小节点并更新之,并释放与之对应的输出缓冲区,直到输出树的最小节点不满足此条件为止。)

工作线程: 循环:

如果 work_queue 不为空,则从 work_queue 中取出一个输入缓冲区(如果取出后 work_queue 为空则唤醒 I/O 线程),然后分配一个新的输出缓冲区,将输入缓冲区的内容压缩并保存到输出缓冲区,然后将输出缓冲区挂到输出树上,再次唤醒 I/O 线程。

[1] 每个缓冲区记录各自在输出流中的起始地址和长度。