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线程框架在这里讨论:
Ond*_*lle 15
此外,除了已经提到的内容:
TExternalThread外部线程的包装器(可通过TThread.CurrentThread类属性访问).SyncObjs单位:支持条件变量,TLightweightEvent,TLightweightSemaphore,TSpinLock,TSpinWait,TInterlocked和更多...Arn*_*hez 13
我认为您所讨论的"原生"问题与TThread实施方式无关,而与RTL的其他方面有关:
string和动态数组)使用asm lock操作码实现,以便进行原子引用计数(x64中的InterlockedDecrement/InterlockedIncrement),这也可能在多线程应用程序上严重扩展(即,当此操作码是执行 - 即使较新的CPU在此方面取得进展,RCU实现可能会更好地扩展).这些弱点对于所有多线程库来说都很常见 - 甚至OTL也会受此影响.它们确实存在于早期的Delphi版本之后,并且仍然存在于Delphi XE2中.64位实现类似(甚至更慢),Mac OS平台共享相同的实现.
请参阅另一个关于如何在Delphi中编写扩展多线程应用程序的问题.
说实话,上述两点只会出现在某些特定类型的应用程序中.
因此,如果您了解这些要点,并且不在线程中滥用内存管理器调用或字符串处理,则无需担心Delphi中的多线程.
我相信所有新引入的功能都已经涵盖了.
对于文档部分,这是经典教程书Martin Harvey的存档副本.多线程 - 德尔福方式.阅读之后,你很可能会意识到没有任何贡献的库(除了,可能是线程池)没有真正的需要,记住,框架不是为你简化的东西,它们也剥夺了你对细粒度的控制.
XE 中引入了 TThreadedQueue。
我发现将信息从工作线程传递到主线程或其他消费者线程很有用。最后一部分,有多个消费者线程,不幸的是有问题。Delphi 2009 引入的一个类TMonitor 有一个bug,用于同步访问TThreadedQueue 中的队列。
XE2 已修复此问题。请参阅tthreadedqueue-not-capable-of-multiple-consumers