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

5

我知道托管线程不能保证在同一个操作系统线程上运行。

如果CLR可能在操作系统线程之间切换托管线程,这种情况会发生多久?频率受什么影响?

我有一个单独的问题,关于如何停止切换发生。对我来说,第二个奖励是这种情况不会经常发生(少于一分钟一次就可以)。

2个回答

7
这完全取决于主机。对于任何特定的主机,线程切换可能(如果有)发生的时间和地点都不能保证。
然而,自从.NET 2.0以来,您可以调用静态的BeginThreadAffinity方法来通知主机正在运行的代码依赖于底层操作系统线程的标识。

http://msdn.microsoft.com/en-us/library/system.threading.thread.beginthreadaffinity(VS.80).aspx

当你的线程完成后,确保调用EndThreadAffinity方法(如果你不调用EndThreadAffinity方法让线程结束,我不确定会发生什么。我无法想象它会产生什么影响,但在这个问题上最好是明确的)。

http://msdn.microsoft.com/en-us/library/system.threading.thread.endthreadaffinity(VS.80).aspx


4
据我所知,CLR的当前实现将托管线程映射到操作系统线程。然而,正如文档所说,这并不是必须的,即它是一个实现细节,因此不能做出任何假设。它可能会改变,但即使它没有改变,文档的建议也是您不应该依赖一对一的映射。
正如casperOne指出的那样,您可以设置线程亲和性,但除此之外,没有任何保证。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接