如何强制CLR展示OS线程切换?

时间:2013-03-14 10:02:18

标签: c# clr pinvoke

与这些问题相关:

  

How do I get the _real_ thread id in a CLR "friendly" way?

     

How often does a managed thread switch OS threads?

我希望能够实际测试Thread.BeginThreadAffinity()方法并验证它们的工作方式以及它们的工作原理。

是否有一些.NET功能会强制操作系统线程切换?

1 个答案:

答案 0 :(得分:3)

使用Thread.BeginThreadAffinity()测试的内容不多。我在CLR主机IHostTaskManager::BeginThreadAffinity()中调用了一个函数。 IHostTaskManager是一个可选接口,自定义CLR主机可以实现该接口以提供自定义线程实现,该实现不一定使用操作系统线程。 ICLRTaskManager和ICLRTask接口为这样的自定义线程提供核心服务。

这些接口是在SQL 2.0团队的请求下在.NET 2.0中添加的。基于 fiber ,SQL Server已经内置了一个自定义线程选项很长一段时间。在过去,当具有多个处理器核心的机器仍然很少时,纤维很受欢迎。光纤的其他名称是“绿线”和“共同例程”。在过去十年中,它们已经被多核革命所吸引。

SQL Server项目破产了。他们无法让它足够可靠并放弃了这个项目。不幸的是,我们留下了后果,没有简单的方法将.NET线程映射到OS线程,这是第一个链接的主题。以及接受的答案中显示的相当多的FUD。

虽然CLR仍然具有此功能的基本支持,但我不知道自定义主机实现其自己的线程的单个示例。 SQL Server团队项目的大规模失败肯定是一个重要的标志,考虑到团队可以访问的资源来实现这一点,这很难实现。它通常没有意义,将单个线程映射到单个处理器核心,正如默认情况下由操作系统所做并由默认CLR主机使用的那样,效率难以置信。这些天购买的处理器内核非常便宜。

长话短说:Thread.BeginThreadAffinity()执行没有。默认情况下,CLR线程已经与OS线程相关联。您可能会遇到自定义CLR主机的几率完全接近于零以忽略该方法。

调用OS线程上下文切换的一种简单方法是使用WaitHandle.WaitXxx()方法之一或者使用非零等待的Thread.Sleep()。