线程池实现

这段代码实现了一个线程池系统,包含线程工作器(ThreadWorker)、线程(EdoyunThread)和线程池(EdoyunThreadPool)三个主要部分。下面是对代码的详细分析:

1. ThreadWorker 类

ThreadWorker 是一个可调用对象的封装,主要功能是:

  • 存储一个成员函数指针和对应的对象实例

  • 通过 operator() 调用存储的成员函数

  • 提供 IsValid() 方法检查是否包含有效的函数

问题点

  1. 拷贝构造函数实现为空,没有实际拷贝成员变量

  2. operator= 实现缺少 return 语句

  3. 函数指针类型定义使用了 typedef,现代 C++ 建议使用 using

2. EdoyunThread 类

实现了一个可管理的工作线程,主要功能:

  • 通过 Start() 启动线程

  • 通过 Stop() 停止线程

  • 使用原子变量 m_worker 存储和更新工作任务

  • 线程函数 ThreadWorker() 循环执行分配的任务

问题点

  1. ThreadEntry 静态函数将参数转换为 EdoyunThread* 但传入的是 NULL

  2. UpdataWorker 方法缺少 return 语句

  3. 没有正确处理线程句柄的关闭 (CloseHandle)

  4. 检查线程句柄有效性时使用了错误的逻辑 m_hThread == NULL || (m_hThread = INVALID_HANDLE_VALUE)

  5. each_step() 纯虚函数声明了但从未使用

  6. 混合使用了 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;
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值