Delphi XE中多线程的新内容是什么?

26

我曾经看到人们讨论Delphi XE中的新多线程功能,以及由于实现多线程的方式而导致Delphi存在一些“本地”问题。他们推荐使用一些外部库来替代默认的Delphi多线程。

你能为我提供一些文档和最受欢迎的Delphi XE多线程库吗? 谢谢


7
TThread.NameThreadForDebugging 存在于 D2010 中。我相信 Delphi 自带的线程代码没有任何严重的问题。最流行和最好的线程库是OmniThreadLibrary,但 @gabr 太谦虚了,不愿意这么说。 - David Heffernan
1
Delphi在实现线程方面没有“本地问题”。自2003年以来,我一直在使用基于TThread的类,没有遇到任何真正的麻烦。然而,您仍然希望从现有的第三方线程框架开始,以节省自己的麻烦。 - Misha
3
如果程序员未学习线程,无论是在Delphi还是几乎任何其他编程语言中,都会遇到相同的问题。唯一我认为有缺陷的是TThread本身没有实现所有你可能希望实现的功能,例如你需要自己编写代码来构建一个可暂停的工作线程。但正如David所说,你不必重新发明轮子,只需使用OmniThreadLibrary即可。 - Warren P
1
谢谢大家。我现在正在阅读经典 Delphi 线程的文档,等看完后会去看 Omni Thread lib 的文档。 - Gabriel
2
@DavidHeffernan,是的,问题已经解决了!请查看我在这里更新的信息:tthreadedqueue-not-capable-of-multiple-consumers - LU RD
显示剩余5条评论
6个回答

28

有趣的是,如果命名线程如此方便,那么任何人都想创建一个匿名线程对象,即使它没有与之关联的函数,因为它只是一个闭包(另一个函数内部的代码块)。个人而言,我希望所有后台线程代码都从继承自TThread的类中运行。 - Warren P
1
@Warren 有什么原因吗? - David Heffernan
1
沃伦,没有人阻止你 :) 但是,有时候匿名的后台工作者就足够了。 - gabr
那种渴望的原因是,即使没有匿名线程,调试线程也已经够痛苦了。 - Warren P
2
@Warren,我看不出你不能给你的临时线程命名的原因。TThread.NameThreadForDebugging是一个作用于当前线程的类函数。只需在匿名函数中调用即可。 (CreateAnonymousThread是个错误的叫法;所有线程都是匿名的,直到它们被命名,而*默认情况下,没有任何线程被命名。) - Rob Kennedy
显示剩余2条评论

16

14

我认为你提到的“本地”问题与 TThread 的实现方式无关,而是与RTL的其他方面有关:

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

这些弱点适用于所有多线程库-即使OTL也会受到这个问题的影响。自早期的Delphi版本以来就存在,并且在Delphi XE2中仍然存在。 64位实现类似(甚至更慢),Mac OS平台共享完全相同的实现。

请参见此其他SO问题,了解如何编写在Delphi中扩展多线程应用程序。

说实话,上面两点仅会出现在某些非常特定的应用程序中。

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


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

7
我相信所有新引入的功能已经被涵盖了。
至于文档部分,这里有一份关于经典教程书籍的存档副本 Martin Harvey. Multithreading - The Delphi Way. 阅读后,您很可能会意识到除了线程池之外,没有真正需要任何贡献库(也许)。请记住,框架不仅简化了事情,也剥夺了您对细粒度控制的权利。

1
同时也可在CC中获取:多线程- Delphi方式(更新:V 1.1)。同样还有多线程-异步通知库(V 1.2) - Ondrej Kelle

5

TThreadedQueue是在XE中引入的。

我发现它非常有用,可以将信息从工作线程传递到主线程或其他消费者线程。然而,最后一部分,即具有多个消费者线程的情况,存在一些错误。 TMonitor是一个类,由Delphi 2009引入,用于同步访问TThreadedQueue中的队列,但存在着 bug。

这个问题已经在XE2中得到解决。请参见tthreadedqueue-not-capable-of-multiple-consumers


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接