【问题标题】:logical thread vs physical thread逻辑线程与物理线程
【发布时间】:2013-09-18 03:02:50
【问题描述】:

我在此链接http://msdn.microsoft.com/en-us/library/ms750441.aspx 上阅读了有关 System.Threading.DispatcherObject 类型的信息

文章提到了逻辑线程和物理线程之间的一对一关系。这是文章中的sn-p:

在 WPF 的设计阶段,目标是移动到单个 执行线程,但非线程“关联”模型。线 当组件使用执行者的身份时,就会发生亲和性 线程来存储某种类型的状态。最常见的形式是 使用线程本地存储 (TLS) 来存储状态。 线程亲和力 要求每个执行的逻辑线程只属于一个 操作系统中的物理线程,可以变成内存 密集的

有人可以请。解释逻辑线程与物理线程有什么区别?

【问题讨论】:

  • 下一句才是真正重要的。他们只是按照 Windows 上任何 GUI 类库的工作方式进行。简洁从来都不是 WPF 架构师的资产。

标签: c# wpf clr


【解决方案1】:

本地线程是运行时中的线程。该线程比成熟的物理线程更轻量级,适用于更轻量级的进程。物理线程是处理器上下文切换到并处理的线程。当操作系统跟踪它时,它有更多与之关联的元数据。涉及更多细节,但这是一个快速概述。

这种情况下的物理线程将在内部包含这些逻辑“虚拟线程”。

【讨论】:

  • 在评论中我遇到了this edit suggestion - 对我来说这是有道理的,但我不确定。因此,我将其写在这里,以便对此有更多了解的人可以做出更好的决定。
【解决方案2】:

.NET 2.0 的 CLR 确实计划为 SQL CLR 提供 fiber support as .NET 线程。它从未进入产品中,但在遥远的将来,CLR 可能会支持它。因此,这个大红线亲和力警告。

OS does support 是原生的,但它们很难正确使用,因为您在用户模式下切换堆栈以让其他代码在同一物理线程上运行。这确实消除了昂贵的上下文切换,这在某些高性能场景中是有意义的。将纤程用作抽象并不是一个好主意,因为您无法调用任何第三方库,因为您不知道 api 是否确实假设了线程亲和性。

今天的多核机器中上下文切换的成本远低于之前的几个 Windows 版本和几代处理器。我怀疑在现实世界的应用中你会从纤维中获得很多好处。除此之外,芯片制造商正在努力降低上下文切换的成本。有designs discussed 可以让它像一个 CPU 周期一样便宜。

长话短说:

如果您自己托管 CLR 并使用 CLR 托管 API 的(尚不)现有功能,则 CLR 线程对象可能不是物理操作系统线程。

据我所知,即使在 Windows 8 中,Window 消息泵系统也会保留在那里,其中每个窗口都与创建线程具有线程关联,而创建线程也必须泵窗口消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多