我曾经看到人们讨论Delphi XE中的新多线程功能,以及由于实现多线程的方式而导致Delphi存在一些“本地”问题。他们推荐使用一些外部库来替代默认的Delphi多线程。
你能为我提供一些文档和最受欢迎的Delphi XE多线程库吗? 谢谢
我曾经看到人们讨论Delphi XE中的新多线程功能,以及由于实现多线程的方式而导致Delphi存在一些“本地”问题。他们推荐使用一些外部库来替代默认的Delphi多线程。
你能为我提供一些文档和最受欢迎的Delphi XE多线程库吗? 谢谢
[您可以设置线程名称:TThread.NameThreadForDebugging
。(如David所指出的那样,实现于D2010)]
您可以创建匿名线程(执行匿名函数且不需要TThread子类对象):TThread.CreateAnonymousThread
。
有关Delphi线程框架的讨论在这里:
此外,除了已经提到的内容:
TExternalThread
的封装类用于外部线程(可以通过TThread.CurrentThread
类属性访问)。SyncObjs
单元中有很多新功能:支持条件变量、TLightweightEvent
、TLightweightSemaphore
、TSpinLock
、TSpinWait
、TInterlocked
等等...我认为你提到的“本地”问题与 TThread
的实现方式无关,而是与RTL的其他方面有关:
string
和动态数组)使用asm lock
操作码来具有原子引用计数(x64中的InterlockedDecrement / InterlockedIncrement),这可能也会导致多线程应用程序不良扩展(即所有核心在执行此操作码时都会冻结-即使较新的CPU取得了进展,但RCU实现可能扩展更好)。这些弱点适用于所有多线程库-即使OTL也会受到这个问题的影响。自早期的Delphi版本以来就存在,并且在Delphi XE2中仍然存在。 64位实现类似(甚至更慢),Mac OS平台共享完全相同的实现。
请参见此其他SO问题,了解如何编写在Delphi中扩展多线程应用程序。
说实话,上面两点仅会出现在某些非常特定的应用程序中。
因此,如果您知道这些要点并且不滥用内存管理器调用或线程中的字符串处理,则无需担心在Delphi中进行多线程。
TThread.Synchronize
和TThread.Queue
的新重载,现在可以执行匿名方法。
TThreadedQueue是在XE中引入的。
我发现它非常有用,可以将信息从工作线程传递到主线程或其他消费者线程。然而,最后一部分,即具有多个消费者线程的情况,存在一些错误。 TMonitor是一个类,由Delphi 2009引入,用于同步访问TThreadedQueue中的队列,但存在着 bug。
这个问题已经在XE2中得到解决。请参见tthreadedqueue-not-capable-of-multiple-consumers
TThread.NameThreadForDebugging
存在于 D2010 中。我相信 Delphi 自带的线程代码没有任何严重的问题。最流行和最好的线程库是OmniThreadLibrary,但 @gabr 太谦虚了,不愿意这么说。 - David Heffernan