【问题标题】:What are the limitations of MS Concurrency Runtime?MS 并发运行时的限制是什么?
【发布时间】:2024-01-18 13:22:01
【问题描述】:

我在 Visual Studio 2010 中使用简单的并发运行时 task_group 来运行单个工作线程,以将工作与 GUI 线程分开。

但是我的一位同事告诉我,我使用 CR 是错误的:它是为并行处理具有小上下文的轻量级任务而设计的,而不是用于从 GUI 中分离出庞大且依赖 I/O 的线程。他说他从文档中获取了这个,但没有提供任何具体的链接。

那么,Microsoft Concurrency Runtime 有哪些限制,以及解决哪些问题我不应该使用它

当然 CR 不是可移植的,但让我们把它排除在外:我说的是情况,当你的代码编译时,你仍然会遇到问题。

【问题讨论】:

    标签: c++ visual-studio concurrency concurrency-runtime


    【解决方案1】:

    并发运行时是一种协作调度基础架构。如果您不打算利用协作调度,那么您最好在需要时创建线程,并让操作系统负责调度。

    如果您进入协作调度,那么等待 IO 操作完成确实没有意义,因为您阻塞了一个本来可以用于运行其他任务的线程,这不要依赖这个IO操作来完成。如果其他任务依赖 IO 任务来完成,您可以简单地让它们继续,ConcRT 调度程序会确保在它们时间到来时运行它们。

    所以这里真的不是关于限制。只需了解您想要实现的目标,并为工作选择合适的工具。

    【讨论】:

    • 没想到这么久有答案,谢谢!如果我猜对了,您可以使用 CR 创建单线程,但与普通系统线程相比,您会有额外的开销。
    • 就是这样,它不允许你说“创建一个运行这个的线程......”。它只让你说“给定 X 核,确保总是有时间运行我的任务......我会告诉你时不时地安排”。
    【解决方案2】:

    正如 Yam 所说,并发运行时不提供并行执行保证,它只是提供了一种潜在的可能性,这就是任务和线程概念的区别。如果您的任务正确(不要太细化而不能花太多时间在任务之间切换,也不要太粗糙以至于总是为所有内核做一些工作——在你的情况下——只有一个),那么开销不会很大,并且您的程序将准备好在多核或多处理器平台上运行,正如 MSFT 人所说的“面向未来”。

    【讨论】:

      最近更新 更多