运行 每个内核中的线程 Delphi

Run threads in each core in Delphi

我正在使用一个 Delphi 应用程序,我创建了两个线程来与不同的数据库同步,一个用于读取,另一个用于写入。我想知道 Delphi 是否真的使用了每个内核的所有潜力(例如,运行 在具有 4 个内核的 i5 上),或者我是否需要编写特定代码来将线程分配给每个内核.

我不知道如何找到它。

您无需执行任何操作。操作系统在可用内核上安排准备就绪的 运行 线程。

无事可做。 OS 将考虑到大量完全超出您控制范围的因素,选择最佳位置 运行 您的每个线程。 OS 与系统上所有其他进程中的所有其他线程一起管理您的线程。

不要忘记,如果您的线程不是特别忙,则完全没有必要 运行 它们在不同的内核上。

有时将代码移至单独的核心可能会导致意想不到的低效率。记住 CPU 有高速内存缓存;如果某些数据在一个核心的缓存中不可用,则移动到它可能会导致 相对较慢 RAM 访问。

我在这里想表达的意思是,你试图事后猜测所有这些场景和排列是过早的优化。而是让 OS 为您完成工作。 您还有其他应该关注的事情,如下所示。


但是,也就是说线程之间的任何交互都会显着影响 OS 在单独的内核上 运行 它们的能力。例如

  • 在一个极端:如果你的每个线程都通过共享锁做很多工作(也许 reader 线程将数据放在写入者使用的共享位置,所以使用锁来避免竞争条件),那么两个线程很可能会 运行 在同一个核心上。
  • 最好的情况是线程之间的交互为零。在这种情况下,OS 可以轻松地 运行 单独内核上的线程。

One thing to be aware of is that the threads can interact even if you didn't explicitly code anything to do so. The default memory manger is shared between all threads. So if you do a lot of dynamic memory allocation in each thread, you can experience contention limiting scalability across large numbers of cores.

所以你要关注的重要事情是让你的设计 "correct":

  • 确保 "clean" 关注点分离。
  • 消除线程之间不必要的交互。
  • 确保需要的任何交互使用最合适的技术满足您的要求.

如上正确,OS 将尽可能高效地安排您的线程。