java多线程条件变量_线程池中使用条件变量和信号量的性能比较

面试的时候经常被问到互斥量,条件变量和信号量之间的问题。比如前几天华为面试就被问到互斥量和信号量的区别,说到互斥量也可以使用一个二值信号量来实现,什么情况是只能使用互斥量而不能使用信号量的。这个问题当时我只回答出一种情况,想了解详情的可自行百度。如面试官所说,信号量可以实现互斥量,大部分情况下也可以实现条件变量。甚至使用信号量的实现远比其他实现更容易理解。然而很多时候使用信号量替换条件变量的可能会降低并发程序的性能。

下面是我自己实现的一个线程池的代码:

github地址

这个线程池内部维护一个同步队列,同步队列实现了阻塞的pop和push接口。当队列为空的时候,在一个_emptyCond条件变量上等待;当队列满的时候,在一个_fullCond条件变量上等待。

核心代码如下:

template

T SyncQueue::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

void SyncQueue::push(T t) {

{

ScopedLocker lock(_qMutex);

while (_q.size() == _capacity) {

pthread_cond_wait(&_fullCond, &_qMutex);

}

_q.push_back(t);

}

pthread_cond_signal(&_emptyCond);

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

使用这个线程池跑测试程序时,CPU的平均使用率为93%。

现在改为使用信号量的进行同步的队列,核心代码如下(git项目中的feature/semaphore分支):

template

T SyncQueue::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

void SyncQueue::push(T t) {

{

ScopedLocker lock(_qMutex);

while (_q.size() == _capacity) {

pthread_cond_wait(&_fullCond, &_qMutex);

}

_q.push_back(t);

}

pthread_cond_signal(&_emptyCond);

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

运行同样的测试程序,CPU占用率只有83%,比使用条件变量的情况低了将近10%。

注:上述数据是使用top命令观察的结果,精确度有待论证,具体数据以实测为准。

---------------------

作者:Kylin_he

来源:CSDN

原文:https://blog.csdn.net/hekailing/article/details/48601809

版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值