在 Windows 上,当您执行 I/O 时,您可以使用 OVERLAPPED 选项异步执行。这样做与在另一个线程上同步执行 I/O 有什么区别吗?如果是这样,哪个更好?操作系统是否只是在异步情况下生成一个单独的线程,或者它只是在驱动程序线程上排队并发送信号而不是阻塞等待?
谢谢!
在 Windows 上,当您执行 I/O 时,您可以使用 OVERLAPPED 选项异步执行。这样做与在另一个线程上同步执行 I/O 有什么区别吗?如果是这样,哪个更好?操作系统是否只是在异步情况下生成一个单独的线程,或者它只是在驱动程序线程上排队并发送信号而不是阻塞等待?
谢谢!
Windows I/O 本质上是异步的,因此例如在 .NET 中执行异步操作不应该使用线程,一旦操作完成,一些现有线程会短暂借用以通知操作完成,但不会创建线程。
这与在另一个线程上运行同步操作完全不同。它使用了一个线程,这使得程序的可伸缩性大大降低。在 .NET 中,线程的默认本地存储为 1MB,因此运行数千个线程将消耗千兆字节的内存。然后,您还会有在线程之间切换的额外成本,这通常很小,但如果您有很多线程,则可以加起来。
根据 MSDN 开发中心的说法,“异步 I/O 也称为重叠 I/O”此外,它继续说异步 io 由内核处理,实际上是另一个线程。我不了解你,但如果我不必写东西,我不会……这是我懒惰的程序员规则#1。