首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何知道/看到线程在哪个核心上运行?( win XP)

我如何知道/看到线程在哪个核心上运行?( win XP)
EN

Stack Overflow用户
提问于 2009-11-25 17:09:46
回答 3查看 1.4K关注 0票数 2

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

在C#中有其他的解决方案吗?

我试着这样做:

代码语言:javascript
复制
[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

EN

回答 3

Stack Overflow用户

发布于 2009-12-10 20:38:45

首先,你需要确定你想要的“核心号码”。每个核心都有几个与其相关的数字。在这种情况下,我假设您是指核心的OS关联索引。

在这种情况下,假设是一个x86 CPU,您可以获得核心的APIC编号(使用CPUID指令),然后将其用作与关联索引等价的表中的索引。

当然,你必须提前做好等价表。您可以通过访问每个核心(通过设置亲和力,从而了解关联索引)并检索其APIC来实现这一点。

请注意,我不知道您如何在C#中这样做,我不是C#专家。但是它在C中相当容易,在组装上甚至更容易。

票数 1
EN

Stack Overflow用户

发布于 2009-11-25 19:40:48

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

票数 0
EN

Stack Overflow用户

发布于 2009-11-25 19:46:49

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

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

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

尽管如此,我不知道在XP和更早版本上有什么方法可以确定线程运行在哪个内核或处理器上。这可能就是为什么他们将GetProcessorNumber()添加到以Vista开头的API中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1798427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档