当前位置: 首页 > java >正文

线程池实现

这段代码实现了一个线程池系统,包含线程工作器(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;
};

http://www.xdnf.cn/news/3583.html

相关文章:

  • 03 - spring security自定义登出页面
  • 学习c语言的第16天
  • 用c 编写的笔记搜索程序
  • 每天学一个 Linux 命令(33):uniq
  • DarkGS:论文解读与全流程环境配置及数据集测试【基于Ubuntu20.04 】【2025最新实战无坑版!!】
  • Linux工作台文件操作命令全流程解析
  • mescroll.js 是在 H5端 运行的下拉刷新和上拉加载插件
  • 网络编程——Socket 编程详解(TCP / UDP)
  • C++拷贝构造函数详解
  • 使用 Mermaid 在 Markdown 中绘制图表
  • 数字智慧方案6213丨智慧园区规划方案(63页PPT)(文末有下载方式)
  • AI大模型-解决开发环境配置不足问题
  • 【AIStarter苹果版发布】黑苹果部署教程+跨平台AI应用测试指南
  • HCL(HashiCorp Configuration Language)是一种结构化配置语言
  • 13.多边形的三角剖分 (Triangulation) : Triangulation
  • 我的日记杂文
  • 中小企业MES系统详细设计
  • Rain World 雨世界 [DLC 解锁] [Steam Epic] [Windows SteamOS]
  • 新手SEO优化核心步骤
  • 《筑牢防线:全方位守护移动应用免受逆向侵扰》
  • 【JavaScript-Day 1】从零开始:全面了解 JavaScript 是什么、为什么学以及它与 Java 的区别
  • 【云盘】使用阿里云盘托管项目大文件
  • 销售总监求职简历模板
  • ACGRIME:用于全局优化和特征选择的自适应混沌高斯RIME优化器,附完整版免费代码
  • 65. Java 类和对象 - 创建和使用类与对象:摘要
  • [SoC]AXI总线Performance验证方案
  • 一天学完JDBC!!(万字总结)
  • 机器学习中的学习率及其衰减方法全面解析
  • 值此五一劳动节来临之际,
  • Java 入门:自定义标识符规则解析