用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
接下来考虑使用自旋锁试试看,后续补充…