线程池实现
这段代码实现了一个线程池系统,包含线程工作器(ThreadWorker)、线程(EdoyunThread)和线程池(EdoyunThreadPool)三个主要部分。下面是对代码的详细分析:
1. ThreadWorker 类
ThreadWorker 是一个可调用对象的封装,主要功能是:
-
存储一个成员函数指针和对应的对象实例
-
通过 operator() 调用存储的成员函数
-
提供 IsValid() 方法检查是否包含有效的函数
问题点:
-
拷贝构造函数实现为空,没有实际拷贝成员变量
-
operator= 实现缺少 return 语句
-
函数指针类型定义使用了 typedef,现代 C++ 建议使用 using
2. EdoyunThread 类
实现了一个可管理的工作线程,主要功能:
-
通过 Start() 启动线程
-
通过 Stop() 停止线程
-
使用原子变量 m_worker 存储和更新工作任务
-
线程函数 ThreadWorker() 循环执行分配的任务
问题点:
-
ThreadEntry 静态函数将参数转换为 EdoyunThread* 但传入的是 NULL
-
UpdataWorker 方法缺少 return 语句
-
没有正确处理线程句柄的关闭 (CloseHandle)
-
检查线程句柄有效性时使用了错误的逻辑
m_hThread == NULL || (m_hThread = INVALID_HANDLE_VALUE)
-
each_step() 纯虚函数声明了但从未使用
-
混合使用了 C 的 _beginthread/_endthread 和 WinAPI 的 WaitForSingleObject
3. EdoyunThreadPool 类
实现了一个简单的线程池,主要功能:
-
创建指定数量的线程
-
通过 Invoke() 启动所有线程
-
通过 Stop() 停止所有线程
-
计划通过 DispatchWorker() 分配任务(但未实现)
首先,定义了一个空的基类 ThreadFuncBase
和成员函数指针类型 FUNCTYPE,FUNCTYPE
表示返回 int 且无参数的成员函数指针;
class ThreadFuncBase { };
typedef int (ThreadFuncBase::* FUNCTYPE)();
ThreadWorker 类
class ThreadWorker {
public:ThreadWorker() :thiz(NULL), func(NULL) {};ThreadWorker(ThreadFuncBase* obj, FUNCTYPE f):thiz(obj),func(f) { }// ... 其他成员函数
private:ThreadFuncBase* thiz;int (ThreadFuncBase::* func)();
};
EdoyunThread 类
class EdoyunThread {
public:EdoyunThread();~EdoyunThread();bool Start();bool IsValid();bool Stop();bool UpdataWorker(const ThreadWorker& worker = ThreadWorker());
protected:virtual int each_step() = 0;
private:void ThreadWorker();static void ThreadEntry(void* arg);HANDLE m_hThread;bool m_bStatus;std::atomic<ThreadWorker> m_worker;
};
EdoyunThreadPool 类
class EdoyunThreadPool {
public:EdoyunThreadPool(size_t size) {m_threads.resize(size);}~EdoyunThreadPool() {}bool Invoke();void Stop();int DispatchWorker(const ThreadWorker& worker);
private:std::vector<EdoyunThread> m_threads;
};