Delphi 2006 - XE中是否有新的并行编程功能?

3

Delphi 2006 - XE中是否有任何新的并行编程特性?

5个回答

7

在发布版本中很少有涉及。在Delphi 2009中,他们为TThread.Synchronize添加了对匿名方法的支持,在XE中,他们向Generics.Collections添加了线程通信队列。

但社区贡献了一些有趣的东西。例如,请查看OmniThreadLibrary


4

在 Delphi 7 之后引入的最强大但鲜为人知的多线程功能是 TThread.Queue 方法。例如,不需要

Synchronize(
  procedure
  begin
    Form1.Memo1.Lines.Add(‘Begin Execution’);
  end);

你可以使用

Queue(
  procedure
  begin
    Form1.Memo1.Lines.Add(‘Begin Execution’);
  end);

TThread.QueueTThread.Synchronize 的替代品,它允许工作线程在不等待的情况下继续执行(使用 Synchronize 调用时,工作线程会等待主线程完成同步代码的执行)- 这是一个非常好的功能,可以用作使用 PostMessage 进行自定义消息处理的替代方法。


请注意,Delphi 10.2 Tokyo 已经添加了 TThread.ForceQueue()。它类似于 TThread.Queue(),但是即使在主 UI 线程中调用,它也总是将指定的代码排队以供稍后执行。当在主 UI 线程中调用时,TThread.Queue() 不会排队执行,而是立即执行,就像 TThread.Synchronize() 一样。 - Remy Lebeau

4
在Delphi XE中有一个TThread.CreateAnonymousThread,它允许简单地执行后台任务。
一个简单的演示:
TThread.CreateAnonymousThread(
  procedure begin
    Sleep(10000); // replace with a real workload
  end
).Start;

1

自2010年或XE线程可以被命名,但这只在调试器中可见(而不是在例如sysinternals之类的procesxp中)


0

目前即使有支持多线程运行的代码,也没有多核 CPU 可以使用。锁定和解锁问题是造成这种情况的原因。

  1. 内存管理器已经比过去更好了。
  2. 字符串是引用计数。
  3. 接口是引用计数。

加油!


目前没有多核CPU - 你是在说如果我创建线程,它们都在一个核心上运行吗? - RobertFrank
2
它们可以在所有核心上运行,但每当有锁定代码被调用/使用时,它会在内存总线上断言,导致其他CPU /核心在调用期间停止。假设您有一个四核CPU和每个核心上运行的四个线程。当发生锁定时,所有其他CPU /核心必须停止。这里是阅读链接:http://software.intel.com/en-us/articles/implementing-scalable-atomic-locks-for-multi-core-intel-em64t-and-ia32-architectures/ - APZ28
这正是我们在Enhanced RTL和SynScaleMM中想要避免的,可以参考http://synopse.info/forum/viewtopic.php?id=57。但主要的瓶颈明确是内存管理器,而不是那些LOCK asm指令。这时候就需要用到SynScaleMM了。 - Arnaud Bouchez

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