简介
本文将谈一谈并发队列,讲解集中可手写的并发队列的实现方式,以及介绍几种开源并发队列的实现,当然都是c++版本的。
可手撸的并发队列实现起来相对简单,面试的时候可以撸一撸,简单生产环境也可以用一用;
当然,实际生产环境中,还是建议直接用高性能的开源实现。
可手撸的版本包括,单锁队列、双锁队列、原子队列;开源并发队列包括boost中的并发队列、tbb中的并发队列、folly中的并发队列、moodycamel中的并发队列。
单锁队列实现
单锁队列是一种实现简单的并发队列,它通过一个锁控制入队和出队,通过两个条件变量分别控制队列空和队列满。
数据入队之前判断队列是否满,如果满了,则等待full条件变量;出队前判断队列是否为空,如果为空,则等待empty条件变量。当队列满时出队则唤醒full条件变量;当队列为空并入队时,唤醒empty条件变量。
代码如下:
1 |
|
上面的实现可以用单链表代替std::queue。
这种结构实现简单,临界区较小,可以在请求维度的数据中使用。
双锁队列实现
双锁队列是另一种并发队列,使用两把锁分别控制入队和出队,性能相较于单锁的稍微强点。
双锁队列还包括两个条件变量,分别用于表示队列满和队列空;同时还拥有一个原子变量记录当前队列长度。
入队列时,先等待“非满”条件变量,然后入队列,如果队列没满,则唤醒“非满”变量。如果入队前队列是空的,入队后就要唤醒“非空”变量。
出队时,先等待“非空”条件变量,然后出队,如果队列还有数据,则唤醒“非空”变量。如果出队之前队列时非空的,则出队后唤醒“非满”变量。
代码如下:
1 |
|
代码稍微复杂一点,不过还是可以手工实现的。