我前段时间已经看到人们讨论Delphi XE中的新多线程,以及Delphi因为实现多线程的方式而存在一些“原生”问题。他们建议使用一些外部库来替换默认的Delphi多线程。
你能指点我一些文档和Delphi XE最流行的多线程库吗? 感谢
答案 0 :(得分:26)
[你可以设置线程名称:TThread.NameThreadForDebugging。](在David指出的D2010中实现)
您可以创建匿名线程(执行匿名函数且不需要TThread后代对象的线程):TThread.CreateAnonymousThread。
这里讨论Delphi线程框架:
答案 1 :(得分:15)
此外,除了已经提到的内容之外:
TExternalThread
包装器(可通过TThread.CurrentThread
类属性访问)。SyncObjs
单元中的许多新内容:支持condition variables,TLightweightEvent
,TLightweightSemaphore
,TSpinLock
,TSpinWait
,{{ 3}}以及更多... 答案 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