【问题标题】:What existing CLR hosts do not provide one-to-one mapping between managed and unmanaged threads?哪些现有 CLR 主机不提供托管线程和非托管线程之间的一对一映射?
【发布时间】:2023-03-13 17:34:01
【问题描述】:

我知道我应该依赖于托管线程和非托管线程之间存在一对一的映射。来自MSDN

操作系统 ThreadId 与托管线程没有固定关系,因为非托管主机可以控制托管线程和非托管线程之间的关系。具体来说,复杂的主机可以使用 Fiber API 针对同一个操作系统线程调度多个托管线程,或者在不同操作系统线程之间移动一个托管线程。

但在现实生活中,这样的 CLR 主机是否存在?(如果存在,它们是什么?)我刚刚回答了一个相关问题,我想知道我的建议对 @987654322 的实际糟糕程度有多大@。

【问题讨论】:

    标签: c# .net multithreading winapi clr


    【解决方案1】:

    一个可能是 Microsoft SQL Server(从 2005 版开始)。 IIRC 甚至根据他们的要求将特定的托管支持内置到 CLR 2.0 中(有关更多背景信息,另请参阅this blog post),因此他们在使用纤程(也称为用户模式调度)而不是 SQL Server 中的线程时也可以支持 CLR。

    但是,这似乎从未真正奏效过 (source):

    不支持公共语言运行时 (CLR) 执行 轻量级池化。禁用以下两个选项之一:“clr enabled”或 “轻量级池化。

    我认为假设没有(生产就绪)主机不将 CLR 线程映射到主机线程 1:1 是相当安全的。

    围绕 SO 有几个问答似乎表明相同。

    例如,

    【讨论】:

    • 谢谢@Christian.K,我想这就是答案,我得出了同样的结论。我只是让这个问题再拖一会儿。
    • 我也想不出来。甚至 Singularity OS 似乎也有 1:1 的映射。尽管我认为未来假设的沙盒操作系统可能会偏离这一点。在 CLR 中允许非本地线程映射可能是一个好主意,即使它还没有被充分利用。
    • 你没记错;光纤支持一直到 Beta 2。我认为他们放弃了它很遗憾(joeduffyblog.com/2006/11/09/fibers-and-the-clr)。我一度怀疑 WP8.1(用于电话商店应用程序)中的 CLR 可以在光纤上运行,但似乎不太可能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    相关资源
    最近更新 更多