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

WeG*_*ars 24 delphi multithreading delphi-xe

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

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

gab*_*abr 26

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

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

Delphi线程框架在这里讨论:

  • @Warren,我认为您没有理由不能命名您的临时线程。TThread.NameThreadForDebugging 是一个类函数,它作用于当前线程的任何位置。只需在匿名函数中调用它。(CreateAnonymousThread 用词不当;*all* 线程在被命名之前都是匿名的,并且 *no* 线程在默认情况下被命名。) (2认同)

Ond*_*lle 15

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


Arn*_*hez 13

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

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

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

请参阅另一个关于如何在Delphi中编写扩展多线程应用程序的问题.

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

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


Lin*_*nas 7

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


Pre*_*ion 7

我相信所有新引入的功能都已经涵盖了.

对于文档部分,这是经典教程书Martin Harvey的存档副本.多线程 - 德尔福方式.阅读之后,你很可能会意识到没有任何贡献的库(除了,可能是线程池)没有真正的需要,记住,框架不是为你简化的东西,它们也剥夺了你对细粒度的控制.


LU *_* RD 5

XE 中引入了 TThreadedQueue。

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

XE2 已修复此问题。请参阅tthreadedqueue-not-capable-of-multiple-consumers