【发布时间】:2010-12-19 17:48:23
【问题描述】:
我现在正在学习如何编写多线程程序,我有一个假设性的问题,即一个程序有多少线程是最佳的。
让我描述两个场景。
第一种情况是我有一个很容易多线程的程序,但每个线程都会做很多工作(每个线程的执行时间大约为秒)。
第二种情况是我有一个程序也很容易多线程,但每个线程的执行时间非常短,大约为毫秒。
在任何一种情况下,多线程程序的最有效方法是什么?是在我的系统内存允许的范围内创建尽可能多的线程,还是在创建新线程之前等待线程完成,这样我每次最多只能运行 4 个工作线程。
一方面,许多线程可能存在内核在线程之间切换的开销问题(据我了解,这不是那么严重的开销)。另一方面,如果我限制运行的线程数,这意味着我将运行额外的检查条件并锁定和解锁计数器变量以跟踪正在运行的线程数,并在旧线程完成时创建新线程.
我可以看到,如果有很多小线程,最好简单地用尽可能多的线程重载我的系统,因为在线程完成运行之前不会有太多的线程切换。这将节省我不断跟踪线程数的开销。
另外,如果只有几个大线程(少数,我的意思是几百个左右的大线程),那么跟踪线程是有意义的,这样我们就可以将线程保持在最佳数量,这样就不会出现非常多的线程切换(因为开销会更大,因为我们可能会在单个线程完成之前切换很多次)。
那么这些假设对于每种情况是否都是正确的,或者是否存在一种在所有情况下都正确的通用方法?
注意:这是假设一个多核系统(现在,让我们忽略超线程)并忽略与多线程相关的任何典型问题(假设所有线程都有私有写入位置,并且只能从公共写入位置读取,锁定和只有在增加或减少活动线程数的计数器时才会解锁)。
谢谢,
-伪造
【问题讨论】:
标签: c++ multithreading optimization