更改进程和线程处理器关联

时间:2015-01-14 18:04:22

标签: c# .net multithreading winapi

Stopwatch在多处理器系统上有一个错误:

  

在多处理器计算机上,运行该线程的处理器无关紧要。但是,由于BIOS或硬件抽象层(HAL)中的错误,您可以在不同的处理器上获得不同的时序结果。要指定线程的处理器关联,请使用ProcessThread.ProcessorAffinity方法。

我试图通过将专用线程绑定到特定处理器来解决这个问题。所以,假设有4个处理器,当前进程被绑定到处理器1和2.我的代码将线程绑定到处理器1.但是当用户将我的进程绑定到仅在处理器2和3上运行时会发生什么?我绑定到处理器1的线程会发生什么?

我尝试查看SetThreadAffinityMaskSetProcessAffinityMask Win32 API(以及.NET Process.ProcessorAffinityProcessThread.ProcessorAffinity),但没有关于此特定情况的说明。由于某种原因,也没有GetThreadAffinityMask API ....

1 个答案:

答案 0 :(得分:1)

系统不允许您指定阻止线程运行的关联。

  • 如果尝试指定空掩码,则API调用将失败。
  • 如果您尝试设置的线程掩码不是进程掩码的子集,则API调用将失败。
  • 如果先设置线程掩码,然后将进程关联性设置为与线程关联性不相交,系统会将线程关联性更改为与进程关联性相同。

因此,简而言之,您无需担心。但是,您尝试设置亲缘关系以便线程被阻止,系统会阻止它发生。

要读取线程关联掩码,必须调用返回前一个掩码的SetThreadAffinityMask