要创建多少个线程?

15 浏览
0 Comments

要创建多少个线程?

我现在正在学习如何编写多线程程序,并且对于一个程序来说,有多少个线程是最优的这个问题有一个假设性的疑问。

让我描述两种情况。

第一种情况是,我有一个可以轻松进行多线程处理的程序,但是每个线程都将执行很多工作(每个线程的执行时间大约为几秒钟)。

第二种情况是,我也有一个可以轻松进行多线程处理的程序,但是每个线程的执行时间非常短,大约为几毫秒。

在这两种情况下,最有效的多线程处理方式是什么?是创建尽可能多的线程以充分利用系统内存,还是等待线程完成后再创建新线程,以便始终只有最多4个工作线程在运行?

一方面,许多线程可能会有核心在线程之间切换的开销问题(据我所知,这个开销并不严重)。另一方面,如果我限制正在运行的线程数量,那么这意味着我将运行额外的检查条件,并锁定和解锁一个计数变量以跟踪正在运行的线程数量,并在旧线程完成后创建新线程。

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

另外,如果只有几个大线程(几百个或更多大线程),那么跟踪线程的数量使得我们可以保持线程处于最佳状态,这样就不会有太多的线程切换(因为在单个线程完成之前,开销会更大,我们可能会多次切换)。

所以,这些假设对于每种情况都正确吗?还是有一种通用的方法适用于所有情况?

注意:这假设是在一个多核系统上(暂时忽略超线程),并且忽略了与多线程相关的任何典型问题(假设所有线程都有私有的写入位置,只能从公共位置读取,在增加或减少活动线程计数器时才进行锁定和解锁)。

谢谢,

-Faken

0
0 Comments

在这段内容中,提到了两种场景下创建线程的方式:第一种是根据CPU核心数创建线程,第二种是使用基于工作项/线程池的方法,类似于.NET并行框架。还有一个好的文章链接,介绍了第二种方法。有人指出,如果任务只运行几微秒,那么设置线程和让它运行所花费的时间几乎与实际工作一样长。此外,如果使用C++和Visual Studio 2010,可以使用并行模式库和并发运行时(PFX是.NET)。然后给出了指向.NET和C++代码的链接。从这些内容可以看出,问题的出现是因为需要决定创建多少个线程才合适。解决方法是根据不同的情况选择合适的方式来创建线程,例如根据CPU核心数或使用线程池的方法。

0
0 Comments

线程的数量是一个常见的问题,它的出现原因是多线程应用程序中共享资源的同步访问导致的效率低下。针对这个问题的解决方法是,首先将线程数量设置为可配置的,并通过配置多个线程数量来评估应用程序的性能。其次,使用操作系统的性能计数器来确定瓶颈所在,避免过早地进行优化。此外,现代操作系统都支持写缓存,所以如果每个线程只写入几KB的数据,大部分写入操作都会被缓存在内存中,不需要担心硬盘延迟的问题。但如果多个线程需要写入同一个文件,由于只能提供串行访问,可能会导致瓶颈,特别是当同时运行的线程较多或写入操作频繁时。因此,在设计多线程应用程序时,需要考虑到共享资源的同步问题以及硬盘的读写效率。

0
0 Comments

这个问题的出现原因是因为线程的创建数量需要根据具体情况来决定,没有一个固定的答案。根据下面的内容,我们可以得出以下解决方法:

1. 考虑使用线程池来管理线程。可以创建一个适合主机系统和任务需求的线程池,比如每个核心一个线程,然后将任务放入一个队列中让线程池来处理。这样做可以避免为每个任务都创建新的线程、分配栈空间等额外开销。

2. 线程池的合适线程数量取决于任务的类型。如果任务是CPU密集型的,那么每个CPU一个线程是一个好的选择,这样可以避免不必要的上下文切换。如果任务是IO密集型的,比如进行套接字通信的线程,那么可以考虑将线程数量增加一倍,以便在等待IO输入时更好地利用处理器。

总之,针对这类问题没有一种适用于所有情况的方法。建议在运行代码时进行性能分析,找出存在的低效之处,并根据结果进行调优。

0