我今天在Dobbs博士的网站上发现了这个
http://www.ddj.com/hpc-high-performance-computing/220300055?pgno=3
这是关于线程实现的一个很好的建议.
用Delphi中的TThread实现这个目标的最佳方法是什么?
谢谢
布赖恩
http://www.ddj.com/hpc-high-performance-computing/220300055?pgno=3
这是关于线程实现的一个很好的建议.
用Delphi中的TThread实现这个目标的最佳方法是什么?
谢谢
布赖恩
===来自Dobbs博士==============
使多线程可配置!程序中使用的线程数应始终可以从0(完全没有其他线程)配置为任意数字.这不仅可以实现最佳性能的定制,而且还可以证明它是一种很好的调试工具,有时候在客户端系统上出现未知竞争条件时也可以成为救星.我记得不止一种情况,客户可以通过关闭多线程来克服致命的错误.这当然不仅适用于多线程文件I / O.
考虑以下伪代码:
int CMyThreadManger::AddThread(CThreadObj theTask) { if(mUsedThreadCount >= gConfiguration.MaxThreadCount()) return theTask.Execute(); // execute task in main thread // add task to thread pool and start the thread ... }
这样的机制并不是很复杂(尽管可能需要的工作量比这里显示的要多一些),但它有时非常有效.它还可以与预构建的线程库一起使用,例如OpenMP或Intel的Threaded Building Blocks.考虑到此处显示的测量结果,最好包含多个可配置的线程计数(例如,一个用于文件I / O,一个用于核心cpu任务).对于文件I / O和<找到的核心数>,默认值可能为0;用于cpu任务.但是所有多线程都应该是可拆卸的.更复杂的方法甚至可能包括一些代码来测试多线程性能并设置自动使用的线程数,甚至可以单独用于不同的任务.
===================
解决方法
我会创建一个抽象类TTask.此类用于执行任务.使用Execute方法:
type TTask = abstract class protected procedure DoExecute; virtual; abstract; public procedure Execute; end; TTaskThread = class (TThread) private FTask : TTask; public constructor Create(const ATask: TTask); // Assigns FTask and enables thread,free on terminate. procedure Execute; override; // Calls FTask.Execute. end;
Execute方法检查线程数.如果未达到max,则使用调用DoExecute的TTaskThread启动一个线程,并因此在线程中执行该任务.如果达到最大值,则直接调用DoExecute.