C++面向对象实现封装线程池

<html xmlns="http://www.w3.org/1999/xhtml"> <head> <style> body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;} th{border: 1px solid gray; padding: 4px; background-color: #DDD;} td{border: 1px solid gray; padding: 4px;} tr:nth-child(2n){background-color: #f8f8f8;} </style> </head> <body><span style="font-weight: bold; font-size: x-large;">面向对象:</span> <div> <table style="table-layout: fixed; word-break: break-all; width: 100%; empty-cells: show; margin-left: 0px; background-color:#EAF2D3;"> <tbody> <tr> <td><span style="font-family: Consolas; font-size: 12pt">Noncopyable.h</span> </td> <td><span style="font-family: Consolas; font-size: 12pt">Thread.h</span> </td> </tr> <tr> <td> <div><span style="font-family: Consolas; font-size: 12pt">#ifndef \_\_NONCOPYABLE\_H\_\_</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#define \_\_NONCOPYABLE\_H\_\_</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&lt;iostream&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">using namespace std;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">namespace meihao</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">{</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; class Noncopyable</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public:</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Noncopyable(){};</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ~Noncopyable(){};</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private:</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Noncopyable(const Noncopyable&amp;);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Noncopyable&amp; operator=(const Noncopyable&amp;);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; };</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">};</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#endif&nbsp;</span> </div> </td> <td> <div><span style="font-family: Consolas; font-size: 12pt">#ifndef \_\_THREAD\_H\_\_</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#define \_\_THREAD\_H\_\_</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&lt;iostream&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&quot;Noncopyable.h&quot;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&lt;pthread.h&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">using namespace std;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">namespace meihao</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">{</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; class Thread:private Noncopyable</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public:</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Thread();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; void start();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; void join();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; virtual void run() = 0;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; virtual ~Thread();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; static void\* threadFunc(void\*);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private:</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pthread\_t \_pthId;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bool \_isRunning;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; };</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">};</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#endif</span> </div> </td> </tr> <tr> <td><span style="font-family: Consolas; font-size: 12pt">MutexLock.h</span> </td> <td><span style="font-family: Consolas; font-size: 12pt">Condition.h</span> </td> </tr> <tr> <td> <div><span style="font-family: Consolas; font-size: 12pt">#ifndef \_\_MUTEXLOCK\_H\_\_</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#define \_\_MUTEXLOCK\_H\_\_</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&lt;iostream&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&quot;Noncopyable.h&quot;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&lt;pthread.h&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">using namespace std;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">namespace meihao</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">{</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; class MutexLock:public Noncopyable</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public:</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MutexLock();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ~MutexLock();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; void lock();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; void unlock();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pthread\_mutex\_t\* getMutexPtr();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private:</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pthread\_mutex\_t \_mutex;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; };</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">};</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#endif</span> </div> </td> <td> <div><span style="font-family: Consolas; font-size: 12pt">#ifndef \_\_CONDITION\_H\_\_</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#define \_\_CONDITION\_H\_\_</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&lt;iostream&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&quot;MutexLock.h&quot;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&quot;Noncopyable.h&quot;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">using namespace std;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">namespace meihao</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">{</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; class Condition:private Noncopyable</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public:</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Condition(MutexLock&amp;);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ~Condition();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; void wait();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; void notify();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; void notifyall();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private:</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pthread\_cond\_t \_cond;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MutexLock&amp; \_mutex;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; };</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">};</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#endif</span> </div> </td> </tr> <tr> <td><span style="font-family: Consolas; font-size: 12pt">Buffer.h</span> </td> <td><span style="font-family: Consolas; font-size: 12pt">Task.h</span> </td> </tr> <tr> <td> <div><span style="font-family: Consolas; font-size: 12pt">#ifndef \_\_BUFFER\_H\_\_</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#define \_\_BUFFER\_H\_\_</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&lt;iostream&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&quot;MutexLock.h&quot;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&quot;Condition.h&quot;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&quot;Task.h&quot;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&lt;queue&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">using namespace std;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">namespace meihao</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">{</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; typedef Task\* DataType;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; class Buffer:private Noncopyable</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public:</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Buffer(int);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; void push(DataType);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DataType pop();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; void wakeupEmpty();&nbsp; // 唤醒所有等待队列不为空的线程</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bool full();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bool empty();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private:</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MutexLock \_mutex;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Condition \_notFull;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Condition \_notEmpty;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int \_queSize;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; queue&lt;DataType&gt; \_que;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bool \_flag;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; };</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">};</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#endif</span> </div> </td> <td> <div><span style="font-family: Consolas; font-size: 12pt">#ifndef \_\_TASK\_H\_\_</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#define \_\_TASK\_H\_\_</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&lt;iostream&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">using namespace std;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">namespace meihao</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">{</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; class Task</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public:</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; virtual void process() = 0;&nbsp; // 线程池里面的线程具体要做的任务</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; };</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">};</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#endif</span> </div> </td> </tr> <tr> <td><span style="font-family: Consolas; font-size: 12pt">Threadpool.h</span> </td> <td><span style="font-family: Consolas; font-size: 12pt">ThreadpoolThread.h</span> </td> </tr> <tr> <td> <div><span style="font-family: Consolas; font-size: 12pt">#ifndef \_\_THREADPOOL\_H\_\_</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#define \_\_THREADPOOL\_H\_\_</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&lt;iostream&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&quot;Noncopyable.h&quot;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&quot;Task.h&quot;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&quot;Buffer.h&quot;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&lt;vector&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&quot;Thread.h&quot;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">using namespace std;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">namespace meihao</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">{</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; class Threadpool:private Noncopyable</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public:</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Threadpool(int,int);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; void start();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; void stop();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; void addTask(Task\*);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Task\* getTask();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; void threadFunc();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private:</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int \_threadNum;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; vector&lt;Thread\*&gt; \_threadsVec;&nbsp; // 存放线程池里面的所有线程</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int \_bufSize;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Buffer \_buf;&nbsp; // 缓冲区用来存放任务,到时候线程池从里面取走一个任务执行</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bool \_isExit;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; };</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">};</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#endif</span> </div> </td> <td> <div><span style="font-family: Consolas; font-size: 12pt">#ifndef \_\_THREADPOOLTHREAD\_H\_\_</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#define \_\_THREADPOOLTHREAD\_H\_\_</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&lt;iostream&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&quot;Thread.h&quot;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&quot;Threadpool.h&quot;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">using namespace std;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">namespace meihao</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">{</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; class Threadpoolthread:public Thread</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public:</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Threadpoolthread(Threadpool&amp; threadpool):\_threadpool(threadpool){}</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; void run()</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \_threadpool.threadFunc();&nbsp; // 继承的线程池线程内部实现的线程执行体方法</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // 调用线程池的threadFunc方法,线程池的所有线程都去执行这个方法</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; private:</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Threadpool&amp; \_threadpool;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; };</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">};</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#endif</span> </div> </td> </tr> <tr> <td><span style="font-family: Consolas; font-size: 12pt">Thread.cpp</span> </td> <td><span style="font-family: Consolas; font-size: 12pt">MutexLock.cpp</span> </td> </tr> <tr> <td> <div><span style="font-family: Consolas; font-size: 12pt">#include&quot;Thread.h&quot;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&lt;iostream&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">using namespace std;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">namespace meihao</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">{</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; Thread::Thread():\_pthId(0),\_isRunning(false)</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; void Thread::start()</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pthread\_create(&amp;\_pthId,NULL,&amp;Thread::threadFunc,this);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \_isRunning = true;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; void Thread::join()</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(\_isRunning)</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pthread\_join(\_pthId,NULL);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; Thread::~Thread()</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(\_isRunning)</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pthread\_detach(\_pthId);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; void\* Thread::threadFunc(void\* arg)</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Thread\* pthread = static\_cast&lt;Thread\*&gt; (arg);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(NULL!=pthread)</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pthread-&gt;run();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">};</span> </div> </td> <td> <div><span style="font-family: Consolas; font-size: 12pt">#include&lt;iostream&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&quot;MutexLock.h&quot;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">using namespace std;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">namespace meihao</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">{</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; MutexLock::MutexLock()</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pthread\_mutex\_init(&amp;\_mutex,NULL);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; MutexLock::~MutexLock()</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pthread\_mutex\_destroy(&amp;\_mutex);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; void MutexLock::lock()</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pthread\_mutex\_lock(&amp;\_mutex);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; void MutexLock::unlock()</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pthread\_mutex\_unlock(&amp;\_mutex);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; pthread\_mutex\_t\* MutexLock::getMutexPtr()</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return &amp;\_mutex;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">};</span> </div> </td> </tr> <tr> <td><span style="font-family: Consolas; font-size: 12pt">Condition.cpp</span> </td> <td><span style="font-family: Consolas; font-size: 12pt">Buffer.cpp</span> </td> </tr> <tr> <td> <div><span style="font-family: Consolas; font-size: 12pt">#include&quot;Condition.h&quot;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&lt;iostream&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">using namespace std;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">namespace meihao</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">{</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; Condition::Condition(MutexLock&amp; mutex):\_mutex(mutex)</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pthread\_cond\_init(&amp;\_cond,NULL);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; Condition::~Condition()</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pthread\_cond\_destroy(&amp;\_cond);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; void Condition::wait()</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pthread\_cond\_wait(&amp;\_cond,\_mutex.getMutexPtr());</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; void Condition::notify()</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pthread\_cond\_signal(&amp;\_cond);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; void Condition::notifyall()</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pthread\_cond\_broadcast(&amp;\_cond);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">};</span> </div> </td> <td> <div><span style="font-family: Consolas; font-size: 12pt">#include&lt;iostream&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&quot;Buffer.h&quot;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">using namespace std;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">namespace meihao</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">{</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; Buffer::Buffer(int size):\_queSize(size)</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; ,\_mutex()</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; ,\_notFull(\_mutex)</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; ,\_notEmpty(\_mutex)</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; ,\_flag(true)&nbsp;&nbsp; // 开始,标志位true,表示buffer正常运行</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // 后面线程池要结束的时候会修改为false</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; bool Buffer::full()</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return \_queSize == \_que.size();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; bool Buffer::empty()</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return \_que.size() == 0;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; void Buffer::push(DataType elem)</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \_mutex.lock();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while(full())</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \_notFull.wait();&nbsp; // 队列满,等待条件变量notFull满足</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // 放到while里面是为了防止异常唤醒,唤醒的时候再次确认是否真的条件满足</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \_que.push(elem);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \_notEmpty.notify();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \_mutex.unlock();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; DataType Buffer::pop()</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \_mutex.lock();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while(\_flag&amp;&amp;empty())&nbsp; // flag如果为false表示线程池等待回收线程stop线程池</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \_notEmpty.wait();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(\_flag)</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DataType tmp = \_que.front();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \_que.pop();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \_notFull.notify();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \_mutex.unlock();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return tmp;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \_mutex.unlock();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return NULL;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; void Buffer::wakeupEmpty()</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \_flag = false;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \_notEmpty.notifyall();&nbsp; // 线程池在要关闭的时候会等待所有线程执行完挂在等待条件变量notEmpty上</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //这个时候直接唤醒所有等待的线程</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">};</span> </div> </td> </tr> <tr> <td><span style="font-family: Consolas; font-size: 12pt">test.cpp</span> </td> <td><span style="font-family: Consolas; font-size: 12pt">Threadpool.cpp</span> </td> </tr> <tr> <td> <div><span style="font-family: Consolas; font-size: 12pt">#include&lt;iostream&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&quot;Threadpool.h&quot;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&lt;unistd.h&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">using namespace std;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">class MyTask:public meihao::Task</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">{</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; public:</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; void process()</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ::srand(time(NULL));</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int num = ::rand()%100;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cout&lt;&lt;&quot;produce a num:&quot;&lt;&lt;num&lt;&lt;endl;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">};</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">int main()</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">{</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; meihao::Threadpool threadpool(4,10);&nbsp; // 定义一个线程池,里面有4个线程,去处理10个任务</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; threadpool.start();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; meihao::Task\* ptask = new MyTask();&nbsp; // 定义一个具体的任务</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; int cnt = 10;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; while(cnt--)</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; threadpool.addTask(ptask);&nbsp; // 线程池中添加任务</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sleep(1);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; threadpool.stop();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; return 0;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">}</span> </div> <div><span style="font-family: Consolas; font-size: 12pt"><img src="data:image/png;base64,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" /></span> </div> </td> <td> <div><span style="font-family: Consolas; font-size: 12pt">#include&quot;Threadpool.h&quot;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&lt;iostream&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&quot;Threadpoolthread.h&quot;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">#include&lt;unistd.h&gt;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">using namespace std;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">namespace meihao</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">{</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; Threadpool::Threadpool(int threadNum,int bufSize):\_threadNum(threadNum)</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ,\_bufSize(bufSize)</span><span style="font-family: Consolas; font-size: 16px; ">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ,\_buf(\_bufSize)</span><span style="font-family: Consolas; font-size: 16px; ">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ,\_isExit(false)</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \_threadsVec.reserve(\_threadNum);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; void Threadpool::start()</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for(int i=0;i&lt;\_threadNum;++i)</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Thread\* pthread = new Threadpoolthread(\*this);&nbsp; // 创建指定个数个线程</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \_threadsVec.push\_back(pthread);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for(auto&amp; elem:\_threadsVec)</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; elem-&gt;start();&nbsp; // 创造的线程开始启动</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; void Threadpool::stop()</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(!\_isExit)</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while(!\_buf.empty())&nbsp; // 如果缓冲池不空,也就是还有线程在执行</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sleep(1);&nbsp; // 等待所有线程执行完</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // 线程全部执行完将会都挂在\_buf里面的\_notEmpty的条件变量上</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \_buf.wakeupEmpty();&nbsp; // 唤醒所有等待\_notEmpty的线程</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // 这个函数设置flag = false; 所有等待在Buffer里面的pop函数</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // 里的线程将全部返回NULL</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \_isExit = true;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for(auto&amp; elem:\_threadsVec)</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; elem-&gt;join();&nbsp; // 回收所有线程资源</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; delete elem;</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; void Threadpool::addTask(Task\* task)</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \_buf.push(task);</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; Task\* Threadpool::getTask()</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return \_buf.pop();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; void Threadpool::threadFunc()</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while(!\_isExit)</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Task\* task = getTask();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(task)</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; task-&gt;process();</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">&nbsp; &nbsp; &nbsp; &nbsp; }</span> </div> <div><span style="font-family: Consolas; font-size: 12pt">};</span> </div> </td> </tr> </tbody> </table> </div> <div><img src="data:image/png;base64,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" /> </div> <div><br /> </div> <div><br /> </div> <div><br /> </div> <div><br /> </div> </body> </html>
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

AVR 嵌入式单片机芯片的中断系统介绍

<htmlxmlns"http://www.w3.org/1999/xhtml"<head<stylebody,table{fontfamily:微软雅黑;fontsize:13.5pt}table{bordercollapse:collapse;border:solidgray;borderwidth:2px

LINUX打开文件

<htmlxmlns"http://www.w3.org/1999/xhtml"<head<stylebody,table{fontfamily:微软雅黑;fontsize:10pt}table{bordercollapse:collapse;border:solidgray;borderwidth:2px0

KVM调整cpu和内存

一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid