本文作者:传奇大学

Lengend线程分析

传奇大学 2020-04-23 78 抢沙发
文章页顶部广告
Lengend线程分析摘要: TThreadPool 线程池基类 主要负责线程初始化 与管理任务队列 不管理线程自身主要方法2个构造函数TThreadPool.Create(ThreadCount: Integ...

TThreadPool 线程池基类 主要负责线程初始化 与管理任务队列 不管理线程自身

主要方法2个构造函数


TThreadPool.Create(ThreadCount: Integer = MAX_THREAD_COUNT; MaxWork:

  Integer = MAX_QUEUE_WORK_COUNT);

初始化线程数量 并设置最大值 最大值也用于工作队列 

InitPool(ThreadCount); 具体设置工作队列


TThreadPool.Create(ThreadClass: TThreadClass; ThreadCount: Integer; MaxWork: Integer);

创建线程函数 TThreadClass = TPoolThread

并设置OnThreadBegin OnThreadEnd 事件处理函数 添加到FThreadList(TPoolThread)

InterlockedIncrement原子操作计任务数量


DeleteMandatory删除指定任务

StopAllThread停止所有任务

ClearAllThread 清除

FindThread 查找

GetThreadItem 按index 查找

CreateNewThread 执行TPoolThread .create

TThreadPool.SetManageThread(ThreadClass: TThreadClass); 设置 此函数作用不明




TPoolThread 管理线程自身 确切的说是线程池就是管理此类

此类设计比较蛋疼 本应该是个独立的管理类负责管理 线程的挂起 运行

却又写个了run虚函数 实在是不解

本应把API丢给 TThreadPool 创建  

正确的做法是 设计 ThreadManager 

TPoolThread简化成结构体 包含ThreadManager  task 线程锁 标志

然后用一个数组或者链表维护 具体的任务交由task的run函数去执行

thread_proc 里去执行task.run





TWorkQueue 工作队列 TThreadPool.AddWork添加到此队列中

父类TQueue 实现简单的链表功能

同单元的TStack类 预分配一块内存  模拟了栈的快速的寻址 缺点空间太小

同单元的TList 实现使用内存管理

TVector 容器 简单管理


带有APC 的是作者简单线程池实现



BaseThreadProc task.run类似

TBaseThread更像我说的 ThreadManager 包含线程策略


TInterfacePoolThread 继承自TPoolThread 


IThreadRun run接口 APC的

总结两种线程池结合 完美



补充


具体的类结构图



TThreadPool 线程池基类 没有派生类


TBaseThread 虚基类 用户线程从此派生 托管了一个  IBaseThread = interface



TPoolThread 虚基类 派生类 TInterfacePoolThread(托管一个 IPoolThread = interface)


TBaseThread(用户类)  TPoolThread)(池任务) 两者在内存池中进行关联

FThreadClass := TInterfacePoolThrea



TAPC开头的未使用


文章版权及转载声明

作者:传奇大学本文地址:https://www.444.mba/post/1342.html发布于 2020-04-23
文章转载或复制请以超链接形式并注明出处传奇大学

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

分享
您需要 登录账户 后才能发表评论

发表评论

快捷回复:

评论列表 (暂无评论,78人围观)参与讨论

还没有评论,来说两句吧...