如果我有一个多线程程序,我如何知道每个线程在哪个核心上运行?
在C#中有其他的解决方案吗?
我试着这样做:
[DllImport("ntdll"), SuppressUnmanagedCodeSecurity]
public static extern int NtGetCurrentProcessorNumber();我得到了一个例外:
System.EntryPointNotFoundException未处理Message=“无法在DLL‘ntdll”中找到名为'NtGetCurrentProcessorNumber’的入口点。XP_Multicore_try_0.Program.NtGetCurrentProcessorNumber() at XP_Multicore_try_0.Program.loop() in C:\Documents,Settings\evyatarv\Desktop\XP_Multicore_try_0\XP_Multicore_try_0\Program.cs:line 24 at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回调,Object state) at System.Threading.ThreadHelper.ThreadStart()
谢谢,Evyatar
发布于 2009-12-10 20:38:45
首先,你需要确定你想要的“核心号码”。每个核心都有几个与其相关的数字。在这种情况下,我假设您是指核心的OS关联索引。
在这种情况下,假设是一个x86 CPU,您可以获得核心的APIC编号(使用CPUID指令),然后将其用作与关联索引等价的表中的索引。
当然,你必须提前做好等价表。您可以通过访问每个核心(通过设置亲和力,从而了解关联索引)并检索其APIC来实现这一点。
请注意,我不知道您如何在C#中这样做,我不是C#专家。但是它在C中相当容易,在组装上甚至更容易。
发布于 2009-11-25 19:40:48
我不确定有什么好办法。虽然Win32提供了返回现有关联掩码的SetThreadAffinityMask()函数,但.NET线程与操作系统线程的关联并不安全。
发布于 2009-11-25 19:46:49
根据MSDN,NtGetCurrentProcessorNumber可能在未来版本的Windows中被更改或不可用。应用程序应该使用Kernel32.dll中的GetCurrentProcessorNumber函数。
GetCurrentProcessorNumber()也不是在所有版本的Windows上都可用。它可在Vista及以上版本或Windows 2003及以上版本上使用。这意味着,尝试在XP上使用它也会失败。
如果要使用API调用,至少应该先阅读文档。:-)
尽管如此,我不知道在XP和更早版本上有什么方法可以确定线程运行在哪个内核或处理器上。这可能就是为什么他们将GetProcessorNumber()添加到以Vista开头的API中。
https://stackoverflow.com/questions/1798427
复制相似问题