面试的时候经常被问到互斥量,条件变量和信号量之间的问题。比如前几天华为面试就被问到互斥量和信号量的区别,说到互斥量也可以使用一个二值信号量来实现,什么情况是只能使用互斥量而不能使用信号量的。这个问题当时我只回答出一种情况,想了解详情的可自行百度。如面试官所说,信号量可以实现互斥量,大部分情况下也可以实现条件变量。甚至使用信号量的实现远比其他实现更容易理解。然而很多时候使用信号量替换条件变量的可能会降低并发程序的性能。
下面是我自己实现的一个线程池的代码:
github地址
这个线程池内部维护一个同步队列,同步队列实现了阻塞的pop和push接口。当队列为空的时候,在一个_emptyCond条件变量上等待;当队列满的时候,在一个_fullCond条件变量上等待。
核心代码如下:
template<typename T>
T SyncQueue<T>::pop() {
bool wakePush = false;
T t;
{
ScopedLocker lock(_qMutex);
wakePush = (_q.size() == _capacity);
if (_q.empty()) {
pthread_cond_wait(&_emptyCon