【问题标题】:When to allocate a new thread? [closed]什么时候分配一个新线程? [关闭]
【发布时间】:2014-04-17 17:00:41
【问题描述】:

我应该什么时候为任务分配一个新线程?

我有一项任务是计算 100k 个方程并将结果存储到一个数组中,第二个任务是对其进行排序。考虑到我将其设为线程安全代码,我应该坚持使用 2 个线程,还是可以分配 3 个线程来计算 100k 方程的三分之一和第四个线程来处理排序?还是只有 2 个线程?

另外,我有一个 4 核处理器,如果我将具有 4 个线程的程序带到另一台具有 2 个内核的计算机上会发生什么?

谢谢!

【问题讨论】:

  • 听起来你应该尝试一下并对其进行分析。
  • “另外,我有一个 4 核处理器,如果我将具有 4 个线程的程序带到另一台具有 2 个内核的计算机上会发生什么?”不会发生任何异常情况,您只需在双核 CPU 上运行 4 个线程,而不是在四核 CPU 上运行 4 个线程。
  • 每个线程的进度频率将减半(我假设)。
  • 我强烈推荐你去阅读来自微软的免费电子书“Patterns for Parallel Programming”,它解释了很多概念,当你刚接触线程时很容易知道。例如,根据方程式所做的工作,您可能在线程中做的工作太少,并且开销成本最终会使它比您在一个线程上完成所有 100K 时运行得更慢。

标签: c# multithreading performance


【解决方案1】:

首先,为您描述的两个任务(计算和排序)设置两个线程是没有用的,因为您只能在所有计算完成后对结果进行排序,假设您想按结果排序。

对于计算本身,它取决于计算的权重。线程允许您同时执行它们,但也有一些开销。在一个内核上拥有多个线程比只有一个线程要慢,因为您需要在线程之间切换的开销,而没有同时执行的好处。

此外,您将需要一个数组(或列表)的线程安全版本,这可能会慢一些,因为它可能会同步对它的访问。

所以我认为更好的解决方案是将结果存储在每个线程的一个数组中,让线程独立计算,并且只有在它们都完成后才合并数组。我必须承认我不知道您是否可以将单个线程分配给单个内核。如果是这样,我会为每个内核创建一个线程。

在线程之间划分计算时,不要将数组分成 N 等份。可能是您的一个内核正忙于处理来自另一个进程的要求苛刻的线程。如果是这种情况,那么您的进程的线程将几乎没有任何时间。所以最好分配小块,所以如果一个线程比较慢,它只会计算更少的源数组的块。如果您使用线程安全计数器,则每个线程可以在每次计算后选择下一项。

【讨论】:

  • 谢谢,所以如果我稍后再进行排序,我还能将 25k 拆分为第一个线程,将 25k 拆分为第二个线程,类似于其他 2 个以尽快建立结果数组尽可能,还是我只需要 1 个线程来完成所有这些工作? (假设数组和程序是线程安全的)谢谢!
  • 你可以,但其中存在风险,我刚刚在答案中添加了它。但是 100.000 个方程听起来可以很快完成。引入线程会让你的代码更难编写和维护,所以如果单线程计算足够快,我就不会费心了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
相关资源
最近更新 更多