【c++】【线程池】固定式线程池存在的问题以及解决方式
1 线程池只能处理返回值类型为空 参数类型也为空的任务
因为在设计上 固定式线程池使用了
using Task = std::function<void(void)>; 这个设计
解决方式
可以通过bind 的方式解决
在向线程池添加任务时 通过bind进行添加
mypool.AddTask(bind(func, i))
2 如果停止线程池时 内部调用直接停止函数Stop()
m_queue.Stop() 这个函数将同步队列
强制停止了
接着将所有的线程终止掉 有的任务并未得到执行
解决方式
- 将强制停止改为等待停止
- 等待停止设计上 新添加一个条件变量 m_waitStop
- 先获得锁 当任务队列未空一直等待 这里需要设置一个超时时间( 因为这个条件变量不是生产者或者消费者 无人唤醒 会卡死在这里)
- 接着将同步队列是否停止 m_stop置为true
- 唤醒生产者和消费者
3 多线程下的竞态访问
当我使用一个二维数组存储数据 部分向里面添加数据 部分对数据进行排序 由于在多线程的环境下可能会造成竞态访问
解决方式
- 可以给出两个不同线程池处理
- 加锁 但是会导致速度降低 不符合需求
4 并不是线程数越多 执行速度越快
受限于cpu核数和处理机制 以及线程太多等待cpu 切换上下文 反而更消耗时间 导致cpu负载过高
下个文章写线程池的拒绝策略