我如何知道/查看线程运行的核心? (在win XP中)

时间:2009-11-25 17:09:47

标签: multithreading core multicore

如果我有一个多线程程序,我怎么知道哪个核心 每个线程运行?

C#中的win XP还有其他解决方案吗?

我试试这个:

[DllImport("ntdll"), SuppressUnmanagedCodeSecurity]
public static extern int NtGetCurrentProcessorNumber();

我得到了这个例外:

System.EntryPointNotFoundException未处理 Message =“无法在DLL'ntdll'中找到名为'NtGetCurrentProcessorNumber'的入口点。” 来源= “XP_Multicore_try_0” 类型名=“” 堆栈跟踪: 在XP_Multicore_try_0.Program.NtGetCurrentProcessorNumber() 位于C:\ Documents and Settings \ evyatarv \ Desktop \ XP_Multicore_try_0 \ XP_Multicore_try_0 \ Program.cs:第24行的XP_Multicore_try_0.Program.loop() 在System.Threading.ThreadHelper.ThreadStart_Context(对象状态) 在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回调,对象状态) 在System.Threading.ThreadHelper.ThreadStart()

谢谢, Evyatar

3 个答案:

答案 0 :(得分:1)

首先,您需要确定所需的“核心号码”。每个核心都有几个与之相关的数字。在这种情况下,我假设你的意思是核心的OS亲和力指数。

在这种情况下,假设使用x86 CPU,您可以获取核心的APIC编号(使用CPUID指令),然后将其用作与亲和度索引等效的表中的索引。

当然,你必须提前自己制作等价表。你可以通过转到每个核心(通过设置亲和力,因此知道亲和力索引)并检索其APIC来做到这一点。

请注意,我不知道你将如何在C#中做到这一点,我不是C#专家。但它在C中相当容易,甚至在组装时也更容易。

答案 1 :(得分:0)

我不确定有什么好方法。虽然Win32提供了返回现有关联掩码的SetThreadAffinityMask()函数,但.NET线程根据this question与操作系统线程关联是不安全的。

答案 2 :(得分:0)

根据MSDN,在未来版本的Windows中,NtGetCurrentProcessorNumber可能会被更改或不可用。应用程序应使用Kernel32.dll中的GetCurrentProcessorNumber函数。

GetCurrentProcessorNumber()在所有版本的Windows上都不可用。它可以在Vista及更高版本,或Windows Server 2003及更高版本上使用。这意味着尝试在XP上使用它也会失败。

如果您要使用API​​调用,至少应该先阅读文档。 : - )

话虽这么说,我不知道在XP和更早的时候确定正在运行的线程的核心或处理器。这可能就是为什么他们将GetProcessorNumber()添加到以Vista开头的API。