如果我必须并行执行n个操作,我应该生成n个线程还是n-1

时间:2015-02-27 07:57:48

标签: multithreading concurrency parallel-processing locking

操作:执行n个子操作,完成后继续。

  • 方法1:生成n线程,让调用者线程将它们全部加入
  • 方法2:为n-1操作生成n-1个线程,调用者线程执行其中一个操作并加入n-1个线程。

寻找每种方法的利弊。对于哪些用例等,这将是更好的方法。我们也可以认为实现方式。将有一个有限线程的线程池和在系统中运行的多个此类操作。

2 个答案:

答案 0 :(得分:0)

我认为这在很大程度上取决于n的实际价值。

理想情况下,如果n很小,比如3-5或者其他东西,我会选择n-1个线程。 无论哪种方式,如果您正在进行的操作不是非常耗费资源,那么您应该做得很好。

答案 1 :(得分:0)

在大多数情况下,我倾向于选择第一种选择。

它导致另外一个线程,但它通常简化了线程必须执行的实际工作(a)

main:
    for i in 1..n:
        start thread t[i] with worker function work
    for i in 1..n:
        wait for thread t[i]
    exit

work:
    just do work

通过使用第二种方法,您通常必须将单独的工作负载函数作为函数由主线程和所有工作线程调用,因为工作线程往往具有非常特定的(有时是限制性的)签名。

main:
    for i in 1..n-1:
        start thread t[i] with worker function work
    call workfn
    for i in 1..n-1:
        wait for thread t[i]
    exit

work:
    call workfn

workfn:
    just do work

使用单独的线程完成所有工作,您可以在实际的线程函数中完成所有工作,并让主线程完成其中一项工作,只需加入其他所有工作。


(a)一个好的准则是一个函数应该一个的东西并且做好。请记住,这是一个< EM>准则。