要创建多少个线程?
要创建多少个线程?
我现在正在学习如何编写多线程程序,并且对于一个程序来说,有多少个线程是最优的这个问题有一个假设性的疑问。
让我描述两种情况。
第一种情况是,我有一个可以轻松进行多线程处理的程序,但是每个线程都将执行很多工作(每个线程的执行时间大约为几秒钟)。
第二种情况是,我也有一个可以轻松进行多线程处理的程序,但是每个线程的执行时间非常短,大约为几毫秒。
在这两种情况下,最有效的多线程处理方式是什么?是创建尽可能多的线程以充分利用系统内存,还是等待线程完成后再创建新线程,以便始终只有最多4个工作线程在运行?
一方面,许多线程可能会有核心在线程之间切换的开销问题(据我所知,这个开销并不严重)。另一方面,如果我限制正在运行的线程数量,那么这意味着我将运行额外的检查条件,并锁定和解锁一个计数变量以跟踪正在运行的线程数量,并在旧线程完成后创建新线程。
我可以看到,如果有很多小线程,最好是用尽可能多的线程来超载系统,因为在线程完成运行之前不会有太多的线程切换。这样可以节省不断跟踪线程数量的开销。
另外,如果只有几个大线程(几百个或更多大线程),那么跟踪线程的数量使得我们可以保持线程处于最佳状态,这样就不会有太多的线程切换(因为在单个线程完成之前,开销会更大,我们可能会多次切换)。
所以,这些假设对于每种情况都正确吗?还是有一种通用的方法适用于所有情况?
注意:这假设是在一个多核系统上(暂时忽略超线程),并且忽略了与多线程相关的任何典型问题(假设所有线程都有私有的写入位置,只能从公共位置读取,在增加或减少活动线程计数器时才进行锁定和解锁)。
谢谢,
-Faken
这个问题的出现原因是因为线程的创建数量需要根据具体情况来决定,没有一个固定的答案。根据下面的内容,我们可以得出以下解决方法:
1. 考虑使用线程池来管理线程。可以创建一个适合主机系统和任务需求的线程池,比如每个核心一个线程,然后将任务放入一个队列中让线程池来处理。这样做可以避免为每个任务都创建新的线程、分配栈空间等额外开销。
2. 线程池的合适线程数量取决于任务的类型。如果任务是CPU密集型的,那么每个CPU一个线程是一个好的选择,这样可以避免不必要的上下文切换。如果任务是IO密集型的,比如进行套接字通信的线程,那么可以考虑将线程数量增加一倍,以便在等待IO输入时更好地利用处理器。
总之,针对这类问题没有一种适用于所有情况的方法。建议在运行代码时进行性能分析,找出存在的低效之处,并根据结果进行调优。