要创建多少个线程?

Fak*_*ken 1 c++ optimization multithreading

我现在正在学习如何编写mutithreaded程序,我有一个假设的问题,关于程序的最佳线程数.

我来描述两个场景.

第一种情况是我有一个容易多线程的程序,但每个线程将要做很多工作(每个线程的执行时间大约为几秒).

第二种情况是我有一个程序也很容易多线程,但每个线程的执行时间非常短,大​​约为毫秒.

在这些场景中的任何一个场景中,对程序进行多线程处理的最有效方法是什么?它是创建与我的系统内存允许的一样多的线程,还是在创建新线程之前等待线程完成,这样我在任何时候都只能运行4个工作线程的格言.

一方面,许多线程可能会遇到线程在线程之间切换的开销问题(根据我的理解,这不是一个如此严重的开销).另一方面,如果我限制运行的线程数,这意味着我将运行额外的检查条件并锁定和解锁计数器变量以跟踪运行的线程数,并在旧线程完成时创建新线程.

我可以看到,如果有很多小线程,最好简单地用尽可能多的线程重载我的系统,因为在线程完成运行之前不会有太多的线程切换.这将节省我不断跟踪线程数量的开销.

此外,如果只有几个大线程(少数,我的意思是大约一百个大线程),跟踪线程是有意义的,这样我们就可以保持线程处于最佳数量,这样就会有非常多的线程切换(因为开销会更大,因为我们可能会在单个线程完成之前多次切换).

那么这些假设对于每个案例都是正确的,还是存在一种在所有情况下都是正确的做事的普遍方式?

注意:这是假设一个多核心系统(现在,让我们忽略超线程)并让我们忽略与mutithreading相关的任何典型问题(假设所有线程都有私有写入位置,并且只能从公共位置读取,锁定和解锁只发生当递增或递减计数器的活动线程数时).

谢谢,

-Faken

Ana*_*tts 5

场景#1:创建n个线程,其中"n"是CPU核心数

场景#2:相同,但不是一直创建和终止线程,而是使用基于工作项/线程池的方法,就像.NET Parallel Framework一样.

编辑:这是一篇涵盖#2的好文章 - http://msdn.microsoft.com/en-us/magazine/cc163340.aspx ; 让PFx计算出要运行的线程数,您只需描述任务之间的相互关系.