modified: SpatialOmicsCoord.py
[GalaxyCodeBases.git] / BGI / SOAPsnp / CThreadPool.h
blobe0d04044ea8621bd23c38fba341bbefae8a72bb5
1 #ifndef __THREAD_H
2 #define __THREAD_H
4 #include <string>
5 #include <pthread.h>
6 #include <list>
8 using namespace std;
11 /**
12 * 执行任务的类,设置任务数据并执行
13 */
14 class CTask
16 protected:
17 string m_strTaskName; /** 任务的名称 */
18 void* m_ptrData; /** 要执行的任务的具体数据 */
20 public:
21 CTask()
23 m_ptrData = NULL;
25 CTask(string taskName)
27 m_strTaskName = taskName;
28 m_ptrData = NULL;
30 virtual int Run()= 0;
31 void SetData(void* data); /** 设置任务数据 */
32 void releaseData();
34 public:
35 virtual ~CTask(){}
36 };
38 typedef list<CTask*> TaskList; // the task list.
40 /**
41 * 线程池管理类的实现
42 */
43 class CThreadPool
45 private:
46 static TaskList m_TaskList; /** 任务列表 */
47 static bool shutdown; /** 线程退出标志 */
48 int m_iThreadNum; /** 线程池中启动的线程数 */
49 pthread_t *pthread_id;
51 static pthread_mutex_t m_pthreadMutex; /** 线程同步锁 */
52 static pthread_cond_t m_pthreadCond; /** 线程同步的条件变量 */
53 static int m_task_count; // record the tasks number which have not finished.
55 protected:
56 static void* ThreadFunc(void * threadData); /** 新线程的线程回调函数 */
57 static int MoveToIdle(pthread_t tid); /** 线程执行结束后,把自己放入到空闲线程中 */
58 static int MoveToBusy(pthread_t tid); /** 移入到忙碌线程中去 */
60 int Create(); /** 创建线程池中的线程 */
62 public:
63 CThreadPool(int threadNum = 10);
64 int AddTask(CTask *task); /** 把任务添加到任务队列中 */
65 int StopAll(); /** 使线程池中的线程退出 */
66 int getTaskSize(); /** 获取当前任务队列中的任务数 */
67 };
69 #endif