Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
防止Windows更改进程关联_Windows_Multithreading_Scheduling_Affinity - Fatal编程技术网

防止Windows更改进程关联

防止Windows更改进程关联,windows,multithreading,scheduling,affinity,Windows,Multithreading,Scheduling,Affinity,我有一个多线程代码,我想在我的处理器拥有的所有4个内核上运行。也就是说,我创建了四个线程,我希望每个线程都在一个单独的内核上运行 发生的情况是,它开始在四个内核上运行,但偶尔会切换到只有三个内核。唯一运行的是操作系统和我的exe。这有点令人失望,因为它将性能降低了四分之一,这对我来说已经足够重要了 我在TaskManager中看到的流程关联允许流程使用任何核心。我试着限制线程的亲缘关系,但没用。我还试图提高这个过程的优先级,但这也无助于解决这个问题 所以问题是,有没有办法强迫Windows在所有

我有一个多线程代码,我想在我的处理器拥有的所有4个内核上运行。也就是说,我创建了四个线程,我希望每个线程都在一个单独的内核上运行

发生的情况是,它开始在四个内核上运行,但偶尔会切换到只有三个内核。唯一运行的是操作系统和我的exe。这有点令人失望,因为它将性能降低了四分之一,这对我来说已经足够重要了

我在TaskManager中看到的流程关联允许流程使用任何核心。我试着限制线程的亲缘关系,但没用。我还试图提高这个过程的优先级,但这也无助于解决这个问题


所以问题是,有没有办法强迫Windows在所有四个内核上都运行?如果这是不可能的,我可以减少这些中断的频率吗?谢谢

如果这是windows,请尝试SetThreadAffinityMask():

我假设,如果只设置一个位,那么这将强制线程仅在所选处理器(核心)上运行

其他进程/线程功能:


我使用windows视频程序,在渲染视频时,它能够使所有内核保持接近最大值的运行状态。

除非我大错特错,否则这不是亲和力的问题。当然,系统不会将您的进程限制为与特定线程集的关联。如果真的发生了这种情况,系统中的其他一些程序将不得不这样做

然而,更可能的是,简单地说,系统正在以循环方式调度另一个准备运行的线程。您有四个线程随时可以运行。如果有另一个线程准备运行,它将得到它的轮到。现在有5个线程共享4个处理器。当另一个线程正在运行时,只有3个线程能够运行

如果要确保其他线程不会运行,则需要执行以下操作之一:

  • 停止运行要使用CPU资源的其他程序
  • 设置相对线程优先级,使您的线程始终优先于其他线程运行
  • 现在,在这些选项中,第一个是首选选项。如果你把你的线程排在其他线程之上,那么其他线程就根本无法运行。这真的是你想要的吗

    在问题中,您说没有其他进程正在运行。如果是这种情况,并且没有人干预处理器相关性,并且只有一部分线程正在执行,那么唯一的结论是并非所有线程都准备好运行并有工作要做。例如,如果您在一部分工作结束时加入线程,然后继续下一部分工作,则可能会发生这种情况


    也许你的下一步就是把事情缩小一点。使用诸如Process Explorer之类的工具来诊断哪些线程正在实际运行

    谢谢你的回答。嗯,我应该清楚地说,我个人不太关心其他流程——只要流程需要运行,我就需要我的流程和一些系统内容。此外,我的线程对于循环来说很简单,它们总是“随时可以运行”。另一个问题是它们偶尔会完成,我会运行一个新的批处理,所以这可能是另一个进程发生的时候。如果它们总是准备好运行,那么调度程序将运行它们。你在任何时候加入你的线程吗?好吧,我可以保证我的所有4个线程都被执行,但在3个内核上。是的,正如我所说,他们偶尔会完成他们的工作,我会开始一组新的4个线程。很可能是在这种情况下,它会切换到3核。我将再次尝试增加优先级,但到目前为止,这只会增加其他核心的优先级。我怀疑优先级是否会有所帮助。如果真的没有其他线程可以运行,为什么系统不安排一个已经准备好运行的线程呢?唯一的结论是它还没有准备好运行。通常这意味着它是阻塞的。可能是这样的情况,系统更愿意在一个内核上为一些后台系统进程提供处理器时间?谢谢你的回答。然而,正如我所说的,我试图限制线程亲缘关系,但没有成功。我认为是进程关联性发生了变化,线程关联性始终尊重进程关联性。这是windows吗?您是否使用了SetThreadAffinityMask()(每个线程需要一个调用),还是尝试使用任务管理器执行此操作?我曾多次使用该windows视频程序,我从未见过它在渲染时不使用所有核心,因此可以防止线程切换核心。是的,它是windows,我使用了SetThreadAffinityMask(),并为每个线程调用了一次。所以我假设每个线程的每次调用只设置了1位?如果是这样的话,这应该是有效的。我不确定视频程序在渲染时如何避免这个问题。@PeterKravchuk在我看来,您似乎在猜测亲和力是个问题。验证这一点非常容易。别猜了。检查你的亲缘关系。您可以从Process Explorer轻松阅读这些内容。或者你可以在你的程序中检查它们。绝对不要让你的线程只与一个处理器有亲缘关系。那会损害你的表现。不要在代码中设置任何关联。让系统安排线程。只有系统才能看到整个画面。