我今天在Dr Dobbs网站上发现了这篇文章:
http://www.ddj.com/hpc-high-performance-computing/220300055?pgno=3
它提供了关于线程实现的好建议。
我想知道在Delphi中使用TThread实现这个最好的方法是什么?
谢谢
Brian
=== 来自 Dr Dobbs ==============
使多线程可配置!程序中使用的线程数量应该始终可以从0(完全没有额外的线程)到任意数量进行配置。这不仅允许定制以获得最佳性能,而且还证明是一个很好的调试工具,有时也是客户系统上发生未知竞争条件时的救命稻草。我记得有一种情况,客户能够通过关闭多线程来克服致命错误。当然,这不仅适用于多线程文件I/O。
请考虑以下伪代码:
这样的机制并不是非常复杂(虽然可能需要比这里展示的更多的工作),但它有时非常有效。它也可以与预构建的线程库一起使用,例如OpenMP或Intel的Threaded Building Blocks。考虑到这里显示的测量结果,最好包括不止一个可配置的线程计数(例如,一个用于文件I/O,一个用于核心CPU任务)。默认值可能为0(文件I/O)和<数字核心数量>(CPU任务)。但所有多线程都应该是可分离的。更复杂的方法甚至可能包括一些代码来测试多线程性能,并自动设置使用的线程数,甚至可能为不同任务单独设置线程数。
=== 来自 Dr 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任务)。默认值可能为0(文件I/O)和<数字核心数量>(CPU任务)。但所有多线程都应该是可分离的。更复杂的方法甚至可能包括一些代码来测试多线程性能,并自动设置使用的线程数,甚至可能为不同任务单独设置线程数。
WaitMessage()
与线程消息循环(对于 OLE 可能是必要的)。这个主题在 [delphi] 下有很多讨论,请阅读,但最好忽略那些认为 Embarcadero 和 Microsoft 开发人员不如他们的争论,并且试图告诉你使用Suspend()
和Resume()
是可以的。 - mghie