【问题标题】:assign each thread a cpu core为每个线程分配一个 cpu 核心
【发布时间】:2012-03-21 06:38:01
【问题描述】:

我有一个用 .net 4 编写的 Windows 服务,它使用线程定期执行工作。 服务器有超过20个cpu核心。

我在我的 Windows 服务中创建了 10 个线程。是否可以为每个线程分配一个 cpu 核心?

【问题讨论】:

  • 您为什么要对操作系统调度程序/调度程序进行二次猜测?这样的练习很少有好的结果。
  • @Martin: 好奇心和好奇心和好奇心
  • 听起来更像是“我不知道我在做什么”
  • 您不应该关心和控制此类行为。我知道您可以指示最大并行度,从而指示核心使用情况。

标签: c# .net multithreading windows-services


【解决方案1】:

操作系统已经为您做到了这一点。它不能保证每个线程将永远停留在同一个核心上(几乎在所有情况下,也不需要这样做),但它确实试图保持尽可能多的核心忙。这意味着尽可能为所有可用线程提供自己的核心。

【讨论】:

  • 很有可能,但我不确定在哪里可以找到它,就像我不确定在哪里可以找到声称操作系统不会突然重写进程的内存空间的文档一样.它是操作系统 101。一个尝试利用所有 CPU 内核的操作系统从根本上被破坏了。
  • 致 jalf:我阅读了一些文件,我明白你是对的!
【解决方案2】:

可以通过利用本机 Win32 系统调用,特别是 SetThreadAffinityMask。你需要做一些 DllImports:

[DllImport("kernel32.dll")]
static extern IntPtr GetCurrentThread();
[DllImport("kernel32.dll")]
static extern IntPtr SetThreadAffinityMask(IntPtr hThread, IntPtr dwThreadAffinityMask);

然后在每个生成的线程中使用它们(当然,使用不同的掩码参数):

// set affinity of current thread to the given cpuID
SetThreadAffinityMask(GetCurrentThread(), new IntPtr(1 << (int)cpuID));

警告:不能保证 .NET 线程和 OS 线程之间的直接关联,至少根据此:http://msdn.microsoft.com/en-us/library/74169f59.aspx

操作系统 ThreadId 与托管对象没有固定关系 线程,因为一个非托管主机可以控制之间的关系 托管和非托管线程。具体来说,一个复杂的主机可以 使用 Fiber API 调度多个托管线程 操作系统线程,或在不同的托管线程之间移动 操作系统线程。

【讨论】:

  • -1。 .NET 线程是操作系统级别的线程。直到 rprogrammer 能够设置诸如 therad 隔离之类的东西。除非 MS 在主要的 .NET 运行时升级中改变它,否则这几乎是有保证的。
  • @TomTom:我很确定您所说的内容并非对所有版本的 .NET 都有效。在这里阅读:msdn.microsoft.com/en-us/library/74169f59.aspx。我还在帖子中添加了报价。
  • 顺便说一句,我想我已经回答了他的问题,所以我看不出有理由在结尾处对一个有争议的句子投反对票。
  • @TomTom:在我发表的引文中,它说托管线程可以通过光纤调度到同一个内核线程。这如何证明你的观点?我认为情况正好相反。在这一点上,除了你不同意我的观点之外,你还没有提供任何确凿的消息来源来证实你的观点。
  • 即便如此,我最后的评论是作为一种预防措施,理论上这是可能的,我认为它应该留在那里。该操作可以免费试用我发布的代码并亲自查看。
猜你喜欢
  • 1970-01-01
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
  • 1970-01-01
相关资源
最近更新 更多