如何为Windows上的一个线程保留核心?
我正在研究一个非常时间敏感的应用程序,该应用程序在检测到发生了更改时轮询共享内存区域.变化很少,但我需要尽量减少从变更到行动的时间.鉴于变化的频率很低,我认为CPU缓存变冷了.有没有办法为我的轮询线程保留一个核心,以便它不必与其他线程竞争缓存或CPU?
解决方法
仅线程关联(SetThreadAffinityMask)是不够的.它不保留CPU核心,但它反过来,它将线程绑定到您指定的核心(这不是一回事!).
通过约束CPU亲和性,可以降低线程运行的可能性.如果具有较高优先级的另一个线程在同一个核心上运行,则在完成其他线程之前不会调度您的线程(这是Windows调度线程的方式). 你可以“通过”赋予它一个更高优先级的类来确保你的线程运行(不保证,但很可能).如果你随后使用SetThreadAffinityMask,你有可能在大多数常见的桌面CPU(通常是VIPT和PIPT)上保持缓存总是很热.对于TLB,你可能不那么幸运,但你无能为力. 高优先级线程的问题在于它会使其他线程饿死,因为调度已经实现,因此它首先提供更高优先级的类,并且只要不满足这些优先级,下级类就会变为零.因此,在这种情况下的解决方案必须是阻止.否则,您可能会以不利的方式损害系统. 试试这个: >创建一个信号量并与其他进程共享 这将创建一个线程,它将是第一个(或第一个)获得CPU时间的线程,但它没有运行.当编写器线程调用SignalObjectAndWait时,它会自动发出信号并阻塞(即使它等待“零时间”足以重新安排).另一个线程将从信号量中唤醒并完成其工作.由于其高优先级,它不会被其他“正常”(即非实时)线程中断.它会一直占用CPU时间直到完成,然后再次阻塞信号量.此时,SignalObjectAndWait返回. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |