Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 多线程应用程序实际上会比单线程应用程序更快吗?_Multithreading_Cpu Cores_Processors - Fatal编程技术网

Multithreading 多线程应用程序实际上会比单线程应用程序更快吗?

Multithreading 多线程应用程序实际上会比单线程应用程序更快吗?,multithreading,cpu-cores,processors,Multithreading,Cpu Cores,Processors,所有这些都是理论性的,我只是想到了这个问题,我不完全确定答案是什么: 假设您有一个计算4个独立计算的应用程序。(完全独立,不管你按什么顺序做,也不需要一个来计算另一个)。 还假设这些计算很长(分钟)且受CPU限制(不等待任何类型的IO) 1) 现在,如果您有一台单处理器计算机,单线程应用程序在逻辑上要比多线程应用程序快(或与多线程应用程序相同)。由于计算机不能用一个处理器一次做一件以上的事情,这将在上下文切换等方面“浪费”时间。 到目前为止还好吗 2) 如果您有一台4处理器的计算机,那么4个线程

所有这些都是理论性的,我只是想到了这个问题,我不完全确定答案是什么:

假设您有一个计算4个独立计算的应用程序。(完全独立,不管你按什么顺序做,也不需要一个来计算另一个)。 还假设这些计算很长(分钟)且受CPU限制(不等待任何类型的IO)

1) 现在,如果您有一台单处理器计算机,单线程应用程序在逻辑上要比多线程应用程序快(或与多线程应用程序相同)。由于计算机不能用一个处理器一次做一件以上的事情,这将在上下文切换等方面“浪费”时间。 到目前为止还好吗

2) 如果您有一台4处理器的计算机,那么4个线程可能比单线程更快。对吗?您的计算机现在可以一次执行4个操作,因此将应用程序划分为4个线程是合乎逻辑的,并且它应该以4个计算中最长的时间完成。 到目前为止还不错吗

3) 现在我感到困惑的是,为什么我的应用程序会创建比可用处理器(实际上是内核)数量更多的线程?我已经编写过程序,也见过创建数十个或数百个线程的应用程序,但实际上——对于一台普通计算机来说,完美的数字大约是8

另外,我已经读过了: 但他没有平静地回答


干杯

我认为您假设所有程序都是CPU受限的-请记住,您的一些线程将等待I/O(磁盘/网络/用户流量)。

如果某些线程需要与其他方接口,我可以想出比内核更多的线程的一个原因是。。。正在等待服务器的响应。。从数据库中查询某些内容。这将允许线程休眠,直到提供答案为止。这样,其他计算就不必等待了。在4cores->4thread中,线程将等待输入,这可能会导致其他代码也必须等待

向应用程序添加线程并不是为了提高性能。有时,您希望或需要同时执行多个任务,因为这是构建程序的最合乎逻辑的方式

例如,您可能正在编写一个游戏引擎,如果您采用多线程方法,您可能有一个物理线程、一个图形线程、一个网络线程、一个用户输入线程、一个磁盘资源加载线程等

詹姆斯·巴克斯特的观点也非常正确。有时线程正在等待资源,在访问该资源之前无法进一步执行。如果线程数与内核数相同,那么一个内核将被浪费

为什么我会让我的应用程序创建比可用处理器(实际上是内核)数量更多的线程

一个很好的原因是,如果您有等待事件的线程。例如,您可能有一个生产者/消费者应用程序,其中生产者正在从某个数据流中读取数据,并且该数据以突发方式到达:一批中有几百(或数千)条记录,随后是一段时间内没有记录,然后是另一个突发。假设你有一台4核机器。您可以有一个生产者线程来读取数据并将其放入队列,还有三个消费者线程来处理队列

或者,您可以有一个生产者线程和四个消费者线程。大多数情况下,生产者线程是空闲的,给您四个消费者线程来处理队列中的项目。但是,当数据流中的项目可用时,其中一个使用者线程将被交换出去,以支持生产者

这是一个简化的例子,但基本上类似于我在生产中使用的程序

更一般地说,创建比处理单元(通常是CPU内核,尽管超线程的存在会让事情变得更糟)更连续工作(即CPU受限)的线程没有任何意义。如果您知道您的线程不会等待外部事件,那么当您只有
n
内核时,拥有
n+1
线程将浪费线程上下文切换的时间。请注意,这完全是在您的程序上下文中进行的。如果有其他应用程序和操作系统服务正在运行,则应用程序的线程将不时被调出,以便其他应用程序和服务可以获得时间片。但有一种假设是,如果您运行的是CPU密集型程序,那么您将限制同时运行的其他应用程序和服务


当然,你最好的办法是设置一个测试。在一台4核机器上,用1、2、3、4、5。。。线程。完成不同数量的线程所需的时间。我想你会发现,在一台4核的机器上,最合适的位置是3或4;最有可能是4,除非有其他应用程序或操作系统服务占用大量CPU。

您完全正确,假设这些计算是CPU限制的,而不是IO限制的,那么会怎么样?在这种情况下,您将受益于至少与线程一样多的内核,以避免争用/上下文切换。问题是PC上会有其他进程,比如操作系统,需要利用CPU,因此无法完全避免。我认为这最好用“I/O”来表达。特别是,CPU的速度比内存快得多,因此可以将从主存读取视为I/O操作,并尝试在内存响应时为CPU提供一些操作。超线程技术尤其如此,在超线程技术中,你可以让另一个线程非常快地运行。如果你把你说的话再进一步一点——如果我在一台4核计算机上创建4个线程,操作系统可能会决定让我只使用1-2个核,然后让其他线程自己使用。但是如果我创建了40个线程,我就会误导