产生新线程的最少工作量

Posted

技术标签:

【中文标题】产生新线程的最少工作量【英文标题】:Minimum amount of work it is worth spawning a new thread 【发布时间】:2015-04-17 07:39:21 【问题描述】:

如何估算值得生成新线程的最少工作量?我主要对 C++11 std::thread 感兴趣。

详细说明。我试图加速我们的应用程序,因此我继续并行化一个低级函数,该函数在循环中执行非常少且简单的操作(例如不等式和赋值)。不过,此功能在应用程序中是最耗时的。因此,我尝试并行化循环,为循环的两个连续索引生成两个线程,但这会降低性能(我不能准确地说出减速因素,但它可能是 100 倍左右)。

【问题讨论】:

你看过openmp吗? bisqwit.iki.fi/story/howto/openmp 我发现它通常比在一个全新的线程中生成更容易使用,特别是如果你只需要在这里和那里加速循环。 两个连续的索引 听起来很像 虚假共享​​> 或缓存抖动。您的处理器缓存根本不会喜欢它,可能永远不会有任何加速。更好地将循环分成连续的区域并将线程分配给这些区域。例如。前半部分到第一个线程,后半部分到第二个线程。 不要产生新线程,将任务分配给现有线程。如果您关心性能,请重复使用您的线程。 @BasinhetVeld 这将是我的下一次尝试,谢谢。 @PaoloM 您可以实现std::function 对象的线程安全、可等待队列,并让线程从该队列中拉出并执行该对象。 【参考方案1】:

产生一个新线程通常是一项昂贵的操作(在 Windows 中可能更多,在 Linux 中更便宜)。一种替代方法是使用线程池设计模式。这使得重用现有线程而不总是创建/销毁它们成为可能。

如果没有额外的关于应用程序运行的架构和环境的额外知识,很难评估使用多线程是否有利可图的最小工作量。一些经验或实验会很有用。

【讨论】:

以上是关于产生新线程的最少工作量的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的工作线程没有使用 python 多线程产生

产生工作线程

Qt系列文章之三十(基于QThread的线程同步概述)

Qt系列文章之三十(基于QThread的线程同步概述)

JAVA多线程线程安全问题产生的原因

5856. 完成任务的最少工作时间段