为啥需要线程池?
什么情况可以用:
我们经常会遇到一个队列,其中的消息依赖大量的耗时操作,一个线程从队列拉取完全处理不过来,这时候,就需要我们引入线程池的技术。
什么任务队列不适合用
如果队列的消息是有状态的,不建议用,因为多线程的任务分发是随机的,如果你的任务依赖于前一次处理的结果或者对时序有影响,请从整个系统的设计重新考虑任务队列的设计,将不同业务的数据分配到不同的任务队列,来实现对耗时队列的处理,而不是将有状态的任务到多线程处理,否则不可避免要面临数据共享的多线程竞争问题。
线程池如何设计?
1、线程池需要涉及的数据结构接口
工作线程:其中维持了池结构的成员指针,工作worker线程需要通过池成员指针,来获取任务队列的任务。
class CWorker
{
public:
CWorker(): m_nExit(0)
{}
virtual ~CWorker() {}
static void* WorkerCallBack(void * p);
public:
int m_nExit;
pthread_t m_PID;
CThreadPool* m_pPool;
};
任务结构,虚函数RunJob,根据实际情况派生该结构并实现对应的任务队列实现处理,可自定义自己的任务队列结构。
class CJobs
{
public:
CJobs() {};
virtual ~CJobs() {};
virtual void RunJobs() = 0;
static vo