【问题标题】:Using N threads or N-1 threads使用 N 个线程或 N-1 个线程
【发布时间】:2021-06-03 17:10:03
【问题描述】:

我在继承的一些代码中不止一处遇到过这样的代码:

const size_t N = 4;
FOO data[N];
boost::thread_group all_threads;
for(size_t i = 0; i < N-1; i++)
{
    all_threads.create_thread(processData, data[i]);
}
processData(data[N-1]);
all_threads.join_all();

对于N个任务,创建N-1个线程,在主线程中做最后一个数据项。忽略有关创建过多线程(N 始终为 4 或 8)的问题,这是否有任何优点,而不仅仅是在循环中创建 N 个线程?从我的角度来看,processData 有两种不同的调用方法意味着如果参数更新,则需要更改两个位置,并且阅读代码需要额外的认知负担来检查我们是否确实正确地执行了第 N 次调用。

【问题讨论】:

  • 这真的是个人选择和应用程序设计的问题。如果主线程只是在连接上处于空闲状态,那么让它工作是有意义的。但是如果主线程需要做其他事情,那么当然只需要创建一个额外的处理线程,这样主线程就可以做它需要做的事情了。
  • 猜猜它归结为为什么创建然后加入 4 个线程时 3 足以完成这项工作。
  • 改掉一个坏习惯。您会惊讶于有多少人编写分治算法,例如,当他们分区时,启动两个线程并等待 vs 启动一个线程并工作 .
  • @WhozCraig 但在这种情况下,在等待四个线程与在主线程中执行一次然后在需要时等待之间没有显着的执行时间差异(据我所知,给定一个合理的调度程序)其他三个。
  • 这应该包含在一些只编写一次的代码中,允许对processData 的调用无论是否分派到线程看起来都是一样的。这将允许该代码重用线程,而不是不断创建和终止线程。

标签: c++ multithreading boost


【解决方案1】:

创建线程有开销。因此,避免创建线程是有好处的。

这种优点是否重要,取决于用例。对于小的输入,单线程将比并行实现更优化。对于大输入,创建单个线程的影响将是微不足道的。在这些极端之间,可能存在输入大小的间隔,其中单个线程的创建很重要。这可能是一个很小的间隔。

结论:为对称简单创建 N 个线程是合理的。如果您衡量线程创建占用了很大一部分执行时间,那么请考虑所描述的 N-1 技术,甚至是单线程实现。

【讨论】:

    猜你喜欢
    • 2021-12-18
    • 2020-09-17
    • 2018-09-25
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多