一个线程可以同时执行多少个任务?

Nic*_*erg -1 multithreading

一个线程可以同时执行多少个任务?

Dai*_*Dai 5

同时:零个或一个。线程就是线程。不是魔法纱。

如果“并行”是指“并行处理” ,并且考虑等待的任务,那么等待的任务数量没有上限 - 但每个 CPU 硬件线程实际上只会执行一个任务(由于超标量同时多线程,又名超线程,通常是 CPU 核心数的 2 倍)。

还要记住这Task是非常抽象的。它不仅指并发执行/已执行(非阻塞)代码,还可以指由主机环境(例如操作系统)异步处理的待处理 IO(例如磁盘 IO、网络 IO 等),而不是如果它使用“传统”(非异步)操作系统 API 调用,则它会阻塞线程。


回复:评论

我只是在处理服务器上的多个(例如,可以是 5000 个)客户端时遇到问题,并且对于每个客户端,我需要运行一个单独的处理循环。但我担心线程可以处理 0 或 1 个任务。这是否意味着我应该为每个新客户端创建一个新线程?我知道创建多少线程并不重要,它不会改变速度。但速度并不重要——循环应该为每个客户端独立执行。

呃,这与你的问题不太一样 - 但我会尽力解释......

对于他们每个人,我需要运行一个单独的处理循环

不必要。仅仅因为您需要维护每个连接的客户端的状态并不意味着您需要一个单独的“循环”(即执行线程)。

在当今的计算机中,几乎所有网络 IO 基本上都通过 BSD 套接字 API(Windows 上的“WinSock”,在 .NET 中通过 表示System.Net.Sockets.Socket)。请记住,所有类型的计算机都使用套接字,包括简单的单线程计算机。它们不需要为每个连接设置阻塞循环:相反,它们用于在select不阻塞的情况下获取有关套接字状态的信息,并且仅在安全的情况下从套接字的输入缓冲区读取数据。瞧!只需要一个线程。您可以在 .NET 中通过检查Socket.Available、Socket.Select或更好的方法来完成此操作:NetworkStream.ReadAsync例如,使用较新的方法。

如果您使用 BSD Sockets API ( System.Net.Sockets) 那么您应该使用Socket.Select

这是否意味着我应该为每个新客户端创建一个新线程?

* NOOOOONONONONONNONONO - 不,你不知道。Thread为每个连接的客户端创建并运行一个新的客户端( Socket、NetworkStream、TcpClient等)是一种反模式,它将很快耗尽可用进程内存(因为每个客户端在 Windows 桌面上Thread 的默认堆栈成本为 1MB,在 IIS 中约为 250KB)。

我知道创建多少线程并不重要

是的,它确实!。产生大量线程是破坏应用程序网络性能并消耗不必要的大量内存的好方法。

该循环应该为每个客户端独立执行。

请了解异步套接字。通过将asyncC# 中的功能与NetworkStreamorSocket的异步方法结合使用,您的代码将使用尽可能少的线程来处理网络数据。