Thread类中Thread.BeginThreadAffinity()
方法的用途是什么?
如果您提供示例示例,我将了解您是否有帮助。
感谢。
答案 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 锁。