【c++】【线程池】固定式线程池存在的问题以及解决方式

【c++】【线程池】固定式线程池存在的问题以及解决方式

1 线程池只能处理返回值类型为空 参数类型也为空的任务

因为在设计上 固定式线程池使用了
using Task = std::function; 这个设计

解决方式

可以通过bind 的方式解决
在向线程池添加任务时 通过bind进行添加
mypool.AddTask(bind(func, i))

2 如果停止线程池时 内部调用直接停止函数Stop()

m_queue.Stop() 这个函数将同步队列强制停止
接着将所有的线程终止掉 有的任务并未得到执行

解决方式

  1. 强制停止改为等待停止
  2. 等待停止设计上 新添加一个条件变量 m_waitStop
  3. 先获得锁 当任务队列未空一直等待 这里需要设置一个超时时间( 因为这个条件变量不是生产者或者消费者 无人唤醒 会卡死在这里)
  4. 接着将同步队列是否停止 m_stop置为true
  5. 唤醒生产者和消费者

3 多线程下的竞态访问

当我使用一个二维数组存储数据 部分向里面添加数据 部分对数据进行排序 由于在多线程的环境下可能会造成竞态访问

解决方式

  1. 可以给出两个不同线程池处理
  2. 加锁 但是会导致速度降低 不符合需求

4 并不是线程数越多 执行速度越快

受限于cpu核数和处理机制 以及线程太多等待cpu 切换上下文 反而更消耗时间 导致cpu负载过高

下个文章写线程池的拒绝策略

你可能感兴趣的:(c++,c++,开发语言)