Thread类中Thread.BeginThreadAffinity()方法的用途是什么?

时间:2010-03-24 09:22:02

标签: c# multithreading

Thread类中Thread.BeginThreadAffinity()方法的用途是什么? 如果您提供示例示例,我将了解您是否有帮助。

感谢。

2 个答案:

答案 0 :(得分:7)

在.NET 1.x中,Thread始终与操作系统线程匹配。应SQL Server团队的要求,该关联在.NET 2.0中被破坏。 CLR主机现在可以控制线程映射本身,IHostTaskManager是它的工作接口。这个blog post中有一个很好的背景资料。

有时代码确实关心它在特定的操作系统线程上运行。 Windows关键部分和突变体就是一个例子。真的,任何类型的非托管代码互操作。 Thread.BeginThreadAffinity()调用IHostTaskManager :: BeginThreadAffinity()让主机知道该任务不应该被允许在另一个操作系统线程上运行,而是坚持当前正在运行的那个,直到调用EndThreadAffinity()。

但是,不要担心这一点。 SQL Server项目是一个破产,他们无法让它变得可靠。没有迹象表明他们会再试一次。

答案 1 :(得分:4)

您是否阅读了documentation的评论部分。它很好地解释了IMO。

  

一些共同语言的主持人   运行时,例如Microsoft SQL Server   2005年,提供自己的线程   管理。提供它的主机   自己的线程管理可以移动   从一个物理执行任务   操作系统线程到另一个   随时。大多数任务不受影响   通过这种转换。但是,有些任务   有线程亲和力 - 也就是说,它们   取决于物理的身份   操作系统线程。这些任务   必须在执行时通知主机   不应该切换的代码。

     

例如,如果您的应用程序调用   获取操作的系统API   系统锁具有线程亲和力,   比如Win32 CRITICAL_SECTION,你   必须先调用BeginThreadAffinity   获得锁,和   释放后的EndThreadAffinity   锁。