gpt4 book ai didi

windows - 如何在 Windows 上为一个线程保留一个核心?

转载 作者:可可西里 更新时间:2023-11-01 13:59:24 24 4
gpt4 key购买 nike

我正在开发一个对时间非常敏感的应用程序,该应用程序会在检测到发生更改时轮询共享内存区域并采取行动。变化很少见,但我需要尽量缩短从变化到采取行动的时间。鉴于变化不频繁,我认为 CPU 缓存正在变冷。有没有办法为我的轮询线程保留一个核心,这样它就不必与其他线程竞争缓存或 CPU?

最佳答案

单独使用线程关联 (SetThreadAffinityMask) 是不够的。它不保留一个 CPU 核心,但恰恰相反,它将线程绑定(bind)仅到您指定的核心(这不是一回事!)。

通过限制 CPU 亲和性,您可以减少线程运行的可能性。如果另一个具有更高优先级的线程在同一个内核上运行,则您的线程将不会被调度,直到另一个线程完成(这就是 Windows 调度线程的方式)。
在没有约束亲和性的情况下,您的线程有机会被迁移到另一个核心(以它最后一次运行作为该决定的指标)。如果在线程运行后(或正在运行时)经常发生线程迁移,那么线程迁移是不可取的,但如果自上次调度以来已经过去了几十毫秒(缓存将被覆盖),这是一件无害但有益的事情然后无论如何)。

您可以“某种程度上”确保您的线程将通过给它一个更高的优先级类来运行(不能保证,但可能性很大)。如果您随后也使用 SetThreadAffinityMask,则很有可能缓存在最常见的桌面 CPU(幸运的是通常是 VIPT 和 PIPT)上始终处于温暖状态。对于 TLB,你可能就没那么幸运了,但你也无能为力。

高优先级线程的问题是它会饿死其他线程,因为实现了调度所以它首先服务于更高优先级的类,只要这些不满足,低类就会得到零。因此,这种情况下的解决方案必须是阻止。否则,您可能会以不利的方式损害系统。

试试这个:

  • 创建一个信号量并与其他进程共享
  • 将优先级设置为 THREAD_PRIORITY_TIME_CRITICAL
  • 阻塞信号量
  • 在另一个进程中,写入数据后,在信号量上调用SignalObjectAndWait,超时为1(甚至零超时)
  • 如果需要,您可以尝试将它们绑定(bind)到同一个核心

这将创建一个线程,该线程将是第一个(或第一个)获得 CPU 时间的线程,但它没有运行。当编写器线程调用 SignalObjectAndWait 时,它会自动发出信号并阻塞(即使它等待足以重新安排的“零时间”)。另一个线程将从信号量中唤醒并完成它的工作。由于其优先级高,它不会被其他“正常”(即非实时)线程打断。它会一直占用 CPU 时间直到完成,然后再次阻塞在信号量上。此时,SignalObjectAndWait 返回。

关于windows - 如何在 Windows 上为一个线程保留一个核心?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5346692/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com