线程池中使用条件变量和信号量的性能比较
来源:互联网 发布:国际网络专线有哪些 编辑:程序博客网 时间:2024/05/16 05:06
面试的时候经常被问到互斥量,条件变量和信号量之间的问题。比如前几天华为面试就被问到互斥量和信号量的区别,说到互斥量也可以使用一个二值信号量来实现,什么情况是只能使用互斥量而不能使用信号量的。这个问题当时我只回答出一种情况,想了解详情的可自行百度。如面试官所说,信号量可以实现互斥量,大部分情况下也可以实现条件变量。甚至使用信号量的实现远比其他实现更容易理解。然而很多时候使用信号量替换条件变量的可能会降低并发程序的性能。
下面是我自己实现的一个线程池的代码:
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(&_emptyCond, &_qMutex); } wakePush |= (_q.size() == _capacity); if (!_q.empty()) { t = _q.front(); _q.pop_front(); } } if (wakePush) { pthread_cond_broadcast(&_fullCond); } return t;}template <typename T>void SyncQueue<T>::push(T t) { { ScopedLocker lock(_qMutex); while (_q.size() == _capacity) { pthread_cond_wait(&_fullCond, &_qMutex); } _q.push_back(t); } pthread_cond_signal(&_emptyCond);}
使用这个线程池跑测试程序时,CPU的平均使用率为93%。
现在改为使用信号量的进行同步的队列,核心代码如下(git项目中的feature/semaphore分支):
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(&_emptyCond, &_qMutex); } wakePush |= (_q.size() == _capacity); if (!_q.empty()) { t = _q.front(); _q.pop_front(); } } if (wakePush) { pthread_cond_broadcast(&_fullCond); } return t;}template <typename T>void SyncQueue<T>::push(T t) { { ScopedLocker lock(_qMutex); while (_q.size() == _capacity) { pthread_cond_wait(&_fullCond, &_qMutex); } _q.push_back(t); } pthread_cond_signal(&_emptyCond);}
运行同样的测试程序,CPU占用率只有83%,比使用条件变量的情况低了将近10%。
注:上述数据是使用top命令观察的结果,精确度有待论证,具体数据以实测为准。
0 0
- 线程池中使用条件变量和信号量的性能比较
- 线程同步的方法—互斥锁、信号量和条件变量
- 线程同步—条件变量和信号量
- 条件变量和信号量
- 互斥锁,条件变量和信号量的区别
- Linux线程同步(条件变量和信号量)
- Linux下面的线程锁,条件变量以及信号量的使用
- Linux下面的线程锁,条件变量以及信号量的使用
- Linux下面的线程锁,条件变量以及信号量的使用
- Linux下面的线程锁,条件变量以及信号量的使用
- Linux下面的线程锁,条件变量以及信号量的使用
- Linux下面的线程锁,条件变量以及信号量的使用
- Linux下面的线程锁,条件变量以及信号量的使用
- Linux下面的线程锁,条件变量以及信号量的使用
- 信号量与线程互斥锁的区别,互斥锁和条件变量的区别
- 线程同步的方式——Mutex(互斥量)、 Condition variable(条件变量)和Semaphore(信号量)
- 线程条件变量的使用
- Linux 线程锁,条件变量 信号量的区别
- HttpServletResponse响应
- MSYS2开发环境搭建
- thinkphp的问题
- 再谈谷歌搜索引擎使用技巧
- 2015 ACM/ICPC Asia Regional Changchun Online (部分)
- 线程池中使用条件变量和信号量的性能比较
- memcache知识梳理
- Android应用——用LayoutTransition在View动态显示和隐藏时候加上动画
- eclipse的环境变量的配置
- Eclipse快捷键大全
- C++ primer 5 笔记3 chapter 3 字符串, 向量和数组
- JSP和SERVLET区别( 转)
- 软件测试管理
- 内核数据结构-----队列kfifo.h (4.0.8)较新的内核版本