lzpong / threadpool

based on C++11 , a mini threadpool , accept variable number of parameters 基于C++11的线程池,简洁且可以带任意多的参数

Home Page:http://www.cnblogs.com/lzpong/p/6397997.html

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

发现一个bug

lzq20010630 opened this issue · comments

理论上线程被释放之后——pool.size()应该减少一个,但是代码中没有删除_pool中元素的操作导致_pool的大小只增不减,这时如果输入压力增大线程数会因为达到上限而不开辟新线程,极端情况下甚至会导致线程清零(因为删除操作不使计数器减少导致"_pool.size() > _initSize"失效)从而没有线程执行新任务。

草, 我就说不光我一个人发现了这个问题....
我想到了一个解决方法就是在线程池中添加一个erase的方法. 从而删除掉该线程.

找到解决方案了, 与其让当前线程直接停止工作, 不如我们让当前线程等待, 因此我们可以使用条件变量来进行. 具体的代码如下:

if (this->auto_release_free_thread && this->_free_thread_counter > this->init_thread_counter) {
                        std::unique_lock<std::mutex> __thread_lock(this->_threads_lock);
                        this->_thread_cv.wait(__thread_lock, [this]() -> bool {
                            return this->_free_thread_counter <= this->init_thread_counter;
                        });
                    }

草, 我就说不光我一个人发现了这个问题.... 我想到了一个解决方法就是在线程池中添加一个erase的方法. 从而删除掉该线程.

这个线程池不仅这一个bug,我刚测试了一下,线程池的动态添加线程功能不是很理想,我把线程池的最大数量设置为5,初始化时线程池的容量设置为4。当我连续添加五个function(每个function睡眠2s),就会发现第五个线程并没有动态增加一个线程来处理任务,而是等其中一个线程处理完才会处理第五个任务。归根结底,在commit的时候,空闲线程数量计数的时机有bug。

此外,线程池偶尔会无法正常退出,不知道哪里出现了问题。