Delphi XE中的多线程有哪些新功能?

时间:2011-10-11 12:09:23

标签: multithreading delphi delphi-xe

我前段时间已经看到人们讨论Delphi XE中的新多线程,以及Delphi因为实现多线程的方式而存在一些“原生”问题。他们建议使用一些外部库来替换默认的Delphi多线程。

你能指点我一些文档和Delphi XE最流行的多线程库吗? 感谢

6 个答案:

答案 0 :(得分:26)

[你可以设置线程名称:TThread.NameThreadForDebugging。](在David指出的D2010中实现)

您可以创建匿名线程(执行匿名函数且不需要TThread后代对象的线程):TThread.CreateAnonymousThread。

这里讨论Delphi线程框架:

答案 1 :(得分:15)

此外,除了已经提到的内容之外:

答案 2 :(得分:13)

我认为您所讨论的“原生”问题与TThread的实施方式无关,而与RTL的其他方面有关:

  • 内存管理器非常快速且写得很好,但是当在多个内核上运行多个并发线程时,它无法以线性方式扩展;
  • 引用计数类型(如string动态数组)使用asm lock操作码实现,以进行原子引用计数(x64中的InterlockedDecrement / InterlockedIncrement),也可能在多线程应用程序上严重扩展(也就是说,执行此操作码时所有内核都会冻结 - 即使较新的CPU在此方面取得进展,RCU实现可能会更好地扩展)。

这些弱点在所有多线程库中都很常见 - 即使OTL也会受到this的影响。它们确实存在于早期的Delphi版本之后,并且仍然存在于Delphi XE2中。 64位实现类似(甚至更慢),Mac OS平台共享相同的实现。

请参阅this other SO question,了解如何在Delphi中编写扩展多线程应用程序。

老实说,上述两点只会出现在某些特定类型的应用程序中。

因此,如果您了解这些要点,并且不在线程中滥用内存管理器调用或字符串处理,则无需担心Delphi中的多线程。

答案 3 :(得分:7)

gabr可能提到了主要的新增功能。剩下的可能是TThread.Synchronize和TThread.Queue的新重载,它现在可以执行匿名方法。

答案 4 :(得分:7)

我相信所有新推出的功能都已涵盖。

对于文档部分,这里是经典教程书Martin Harvey. Multithreading - The Delphi Way.的存档副本。阅读完之后,您很可能会意识到对任何贡献的库(除了,可能是线程池)没有实际需要,请记住框架不是为你简化的东西,它们也剥夺了你对细粒度的控制。

答案 5 :(得分:4)

TThreadedQueue是在XE中引入的。

我发现将信息从工作线程传递到主线程或其他消费者线程很有用。最后一部分,有多个消费者线程,不幸的是有错误。 TMonitor中有一个错误,这是Delphi 2009引入的一个类,用于同步访问TThreadedQueue中的队列。

XE2修复了这个问题。见tthreadedqueue-not-capable-of-multiple-consumers