簡體   English   中英

防止Windows更改進程關聯

[英]Preventing Windows from changing process affinity

我有一個多線程代碼,我想在我的處理器具有的所有4個內核上運行。 即,我創建了四個線程,並且我希望每個線程都在單獨的內核上運行。

發生的事情是它開始在四個內核上運行,但是偶爾會切換到三個內核。 唯一正在運行的是操作系統和我的exe。 這有點令人失望,因為它將性能降低了四分之一,這對我來說已經足夠了。

我在任務管理器中看到的進程親和力允許該進程使用任何核心。 我試圖限制線程的親和力,但沒有幫助。 我還嘗試增加該過程的優先級,但也無濟於事。

所以問題是,是否有任何方法可以迫使Windows使其在所有四個內核上運行? 如果這不可能,我可以減少這些中斷的頻率嗎? 謝謝!

除非我非常誤解,否則這不是親和力的問題。 當然,系統不會將您的進程限制為與一組特定的線程關聯。 如果確實發生了這種情況,系統中的其他程序將必須這樣做。

但是,更有可能的是,簡單地說,有一個准備運行的線程正在以循環方式調度。 您有四個隨時可以運行的線程。 如果還有另一個線程可以運行,它將輪到它了。 現在有5個線程共享4個處理器。 當另一個線程正在運行時,只有三個線程能夠運行。

如果要確保此類其他線程不會運行,則需要執行以下操作之一:

  1. 停止運行要使用CPU資源的其他程序。
  2. 設置相對線程優先級,以便您的線程始終優先於其他線程運行。

現在,在這些選項中,第一個是首選。 如果您將線程優先於其他線程,則其他線程根本無法運行。 那真的是您想要發生的事情嗎?

在問題中,您說沒有其他進程在運行。 如果是這種情況,並且沒有人干預處理器的親和力,並且只有一部分線程正在執行,那么唯一的結論就是,並非所有線程都准備好運行並有工作要做。 例如,如果您在工作的一部分結束時加入線程,然后再繼續進行下一部分,則可能會發生這種情況。

也許對您來說下一步是縮小范圍。 使用Process Explorer之類的工具來診斷實際正在運行的線程。

如果是Windows,請嘗試SetThreadAffinityMask():

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686247(v=vs.85).aspx

我假設如果只設置一個位,則將強制該線程僅在選定的處理器(核心)上運行。

其他進程/線程功能:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms684847(v=vs.85).aspx

我使用Windows視頻程序,在渲染視頻時,它可以使所有內核以接近最大值的速度運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM