【多线程调试】c++11实现线程池时,工作线程抢不到任务队列的锁

用c++11实现了一个线程池。测试程序中,主线程不停的向任务队列中添加任务,工作线程不停的从任务队列中取任务。
通过打印发现,任务队列的长度不停的在增长,工作队列并没有及时的取到任务去执行。
接下来通过gdb调试,查看线程状态,发现工作线程停止在lock_wait中:

(gdb) 
  Id   Target Id         Frame 
  3    Thread 0x7fcb2d868700 (LWP 16522) "worker 0" 0x00007fcb2e66954d in __lll_lock_wait () from /lib64/libpthread.so.0
  2    Thread 0x7fcb2d067700 (LWP 16523) "worker 1" 0x00007fcb2e66954d in __lll_lock_wait () from /lib64/libpthread.so.0
Python Exception <type 'exceptions.ValueError'> Cannot find type std::_List_const_iterator<std::function<void()> >::_Node: 
* 1    Thread 0x7fcb2e980740 (LWP 16521) "test" __distance<std::_List_const_iterator<std::function<void()> > > (__last=..., __first=)
    at /usr/include/c++/4.8.2/bits/stl_iterator_base_funcs.h:83

说明锁一直被测试主线程占有着,工作线程抢不到。

当任务队列为空时,工作线程应该处于条件变量的等待函数中,如下是正常的:

(gdb) info threads
  Id   Target Id         Frame 
  3    Thread 0x7f8ba4b10700 (LWP 17038) "worker 0" 0x00007f8ba590ea35 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
  2    Thread 0x7f8ba430f700 (LWP 17039) "worker 1" 0x00007f8ba590ea35 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
* 1    Thread 0x7f8ba5c28740 (LWP 17037) "test" 0x00007f8ba4dda85d in nanosleep () from /lib64/libc.so.6

接下来考虑使用自旋锁试试看,后续补充…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值