-1

与这些问题相关:

如何以 CLR“友好”的方式获取 _real_ 线程 ID?

托管线程多久切换一次操作系统线程?

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

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

4

1 回答 1

3

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

应 SQL Server 团队的要求,这些接口是在 .NET 2.0 中添加的。SQL Server 长期以来一直有一个基于 Fiber 的自定义线程选项。光纤在过去很流行,当时具有多个处理器内核的机器仍然很少见。纤维的其他名称是“绿色线程”和“协同程序”。过去十年的多核革命已经将它们放牧。

SQL Server 项目失败了。他们无法获得足够的可靠性并放弃了该项目。不幸的是,我们留下了后果,没有简单的方法可以将 .NET 线程映射到 OS 线程,这是您第一个链接的主题。以及接受的答案中显示的大量 FUD。

虽然 CLR 仍然对这个特性有基本的支持,但我不知道有一个例子是自定义主机实现了自己的线程。SQL Server 团队项目的大规模失败无疑是一个主要的迹象,表明这很难实施,考虑到团队可以访问的资源来完成这项工作。而且一般来说,将单个线程映射到单个处理器内核(默认情况下由操作系统完成并由默认 CLR 主机使用)是没有意义的,在效率方面很难被击败。如今,处理器内核的价格非常便宜。

长话短说: Thread.BeginThreadAffinity()什么都不做。默认情况下,CLR 线程已经与 OS 线程相似。您遇到自定义 CLR 主机的几率几乎为零,足以忽略该方法。

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

于 2013-03-14T12:33:35.343 回答