【问题标题】:Is it possible to use thread-concurrency and parallelism together?是否可以同时使用线程并发和并行性?
【发布时间】:2011-07-09 09:35:50
【问题描述】:

对于我的一个项目,那是一种内容聚合器,我想介绍并发性以及可能的并行性。乍一看,这似乎毫无意义,因为并发性和并行性采用不同的方法。 (通过线程的并发引入了即时并发,而并行提供了潜力)。

所以为了更好地解释我的问题,让我总结一下我的问题集。

由于我的项目是一个内容聚合器(聚合提要、播客和类似内容),它基本上从网络读取数据,解析它们以返回有意义的数据。

所以到目前为止,我采用了一种非常简单的顺序方法。假设我们需要解析一些提要。

foreach(feed in feeds)
{
   read_from_web(feed)
   parse(feed)
}

因此,使用顺序方法解析所有提要并处理它们所花费的时间在很大程度上不仅取决于解析器代码,还取决于从 Web 获取 xml 源所需的时间。我们都知道从网络上读取源代码可能需要不同的时间(因为网络条件和类似问题)。

因此,为了加快代码速度,我可以采用工作线程的方法,这将引入即时并发;

因此,定义数量的工作线程可以同时接受馈送和解析(这肯定会加快整个过程 - 因为我们会看到通过网络等待数据的影响较小)。

这一切都还好,直到我的项目目标受众主要运行多核 cpu——因为他们是游戏玩家——。

我还想在处理内容时利用这些内核,因此开始阅读潜在的并行性http://oreilly.com/catalog/0790145310262。我还没有读完它,不知道这是否已经讨论过了,但我对此有点着迷,想通过stackoverflow询问一下总体思路。

因此,正如本书描述的潜在并行性:潜在并行性意味着您的程序被编写为在并行硬件可用且大致相同时运行得更快 作为等效的顺序程序当它不是时。

所以真正的问题是,当我使用工作线程进行并发时,我还能使用可能的并行性吗? (在工作线程上运行我的提要解析器并仍然将它们分配给 cpu 核心——如果 cpu 当然支持多核)

【问题讨论】:

  • 我看不出区别。当多个内核可用时,工作线程并行执行
  • 请问有这方面的资源吗?我想详细阅读这篇文章以获得更好的理解。
  • 我同意这个;如果某件事是并行运行的,那么它正在同时发生。
  • 那我换个说法;如果我使用并行扩展 Parallel.ForEach,因为代码在单核 cpu 上运行,此代码会同时运行还是仅作为顺序运行?如果稍后是答案,那么这对我来说不是解决方案,因为即使在单核平台上我也必须实现并发。

标签: c# multithreading concurrency parallel-processing


【解决方案1】:

好吧,看来我被书中关于可能并行性的描述弄错了。感谢答案,我能够弄清楚事情;

来自 msdn:http://msdn.microsoft.com/en-us/library/dd460717(VS.100).aspx

任务并行库 (TPL) 是一个 中的一组公共类型和 API System.Threading 和 System.Threading.Tasks 命名空间在 .NET Framework 版本 4。 TPL 的目的是使 开发人员更有效率 简化添加过程 并行性和并发性 应用程序。 TPL 将 动态并发程度 最有效地使用所有 可用的处理器。在 此外,TPL 处理 工作的划分, 线程调度 线程池,取消支持, 状态管理和其他低级 细节。通过使用 TPL,您可以 最大化代码的性能 同时专注于你的工作 程序旨在完成。

所以基本上这意味着 TPL 可以通过线程处理所有并发细节,并且还支持多核并行。

【讨论】:

    【解决方案2】:

    我认为考虑 IO-bound 工作和 CPU-bound 工作更有用;线程可以帮助两者。

    对于受 IO 限制的工作,您可能正在等待外部资源(在您的情况下,是要读取的提要)。如果您必须等待多个外部资源,那么并行等待它们而不是一个接一个地等待它们才有意义。这最好通过启动阻塞 IO 的线程来完成。

    对于 CPU 密集型工作,您希望使用所有内核来最大限度地提高完成该工作的吞吐量。为此,您应该创建一个与您的核心数量大致相同的工作线程池,并在它们之间分解和分配工作。 [你如何分解和分配作品本身就是一个有趣的问题。]

    在实践中,我发现大多数应用程序都有这两个问题,使用线程来解决这两个问题是有意义的。

    【讨论】:

    • 看来我大错特错了——操作系统和调度程序会自动将线程调度到所有可用的内核。这意味着如果有可用的内核,我的工作线程将已经并行运行。问题是为什么要引入并行扩展?从我读到现在,在单核情况下,使用并行扩展的代码将充当顺序?
    猜你喜欢
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多