【发布时间】: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