为旧系统编写一个相对较大的线程应用程序

Ani*_*amy 2 c windows multithreading

今天我的老板和我正在讨论我写的一些代码.我的代码从给定的HTTP/HTTPS链接下载3个文件.我有多线程下载,以便所有3个文件同时下载3个独立的线程.在这次讨论中,我的老板告诉我,代码将被发送给最有可能运行旧硬件和软件的人(我说的是Windows 2000).

在此之前,我从未考虑过线程应用程序如何在旧硬件上扩展.我意识到,如果CPU只有1个内核,则线程无用,甚至可能会使性能恶化.我一直在想这个下载任务是否是I/O操作.这意味着,如果API被阻止等待来自HTTP/HTTPS服务器的信息,是否会同时安排另一个想要进行计算的线程?旧的操作系统会进行此类调度吗?

他说的另一件事是:由于代码将在旧机器上运行,我的应用程序不应该吃CPU.他说Sleep()在CPU密集型任务之后使用调用来允许其他程序有一些喘息空间.现在我总是觉得Sleep()在任何程序中使用都很糟糕.我错了吗?何时使用Sleep()合理?

谢谢你的期待!

jun*_*nix 5

我一直在想这个下载任务是否是I/O操作.这意味着,如果API被阻止等待来自HTTP/HTTPS服务器的信息,是否会同时安排另一个想要进行计算的线程?旧的操作系统会进行此类调度吗?

是的他们这样做.这是阻止IO的笑话.线程被挂起并且其他计算(线程)发生,直到事件唤醒被阻塞的线程.这就是为什么将它分成线程即使对于单核机器而言也是完全有意义的,而不是在单个线程中在下载之间做一些穷人调度.

当然,你的下载会对带宽产生影响,因此线程无法加速下载:-)

他说的另一件事是:由于代码将在旧机器上运行,我的应用程序不应该吃CPU.他说,在CPU密集型任务之后使用Sleep()调用,以允许其他程序有一些喘息空间.

实际上在完成任务后使用睡眠对这里没有帮助.在进行计算之前,经过一段时间的计算(进行时间切片)后进行睡眠可能会有所帮助.但这仅适用于协作系统(例如Windows 3.11).这对于抢占式系统不起作用,其中调度程序使用时间分片来为线程分配计算时间.在这里考虑降低CPU密集型任务的优先级以便为其他任务提供优先权更为重要......

现在我总是觉得使用Sleep()在任何程序中都很糟糕.我错了吗?什么时候使用Sleep()合理?

这实际上取决于你在做什么.如果你实现忙碌等待设置的某个标志,可能在几秒钟之后设置,最好重新检查它是否在进入休眠状态一段时间后设置为了放弃你的预定时间片而不是仅仅通过检查从未设置的标志.

在现代系统中,在计算中引入Sleep是没有意义的,因为它只会减慢计算速度.

调度受操作系统调度程序的约束.他就是那个"大局观"的人.在我看来,"做得更好"的每一种方法只在特定应用程序的范围内有效,在这种应用程序中,您可以对调度程序不明显的某些关系进行概述.

附录:我做了一些研究,发现Windows支持Windows 95的抢占式多任务处理.Windows NT系列(Windows 2000所属的位置)始终支持抢占式多任务处理.