在同一流上启动多个异步读/写操作是否会损坏数据



我正在使用异步I/O,因为它不会阻塞调用线程并在后台执行线程操作。如果我在同一流上调用多个异步操作(如 BeginWrite(),我是否需要担心数据缓冲区内容混合在一起?

假设我想发送 3 个缓冲区:

Buffer1: 1111111111
Buffer2: 2222222222
Buffer3: 3333333333

我不介意缓冲区是否以不正确的顺序发送,所以

333333333311111111112222222222

没问题,但是缓冲液内容物有可能完全混合在一起吗?

122213121212122333313111223333

PS:我 100% 确定有人已经以某种形式问过这个问题......

这取决于流的实现。例如,套接字支持多个重叠的读取和写入请求,文件 API 也是如此。它们保证了每个操作(没有交错内容)和操作顺序的一致性:例如,对于套接字读取,收到的字节将按发布的顺序放置在缓冲区中。如果不提供这些保证,就不可能编写高性能网络应用程序,因为需要重叠的发送,但高性能网络IO实际上需要重叠的接收。许多文章中都描述了此行为,包括良好的 ole' Windows 套接字 2.0:使用完成端口编写可缩放的 Winsock 应用,并记录在 MSDN 重叠输入/输出中:

发送和接收操作都可以 重叠。接收函数 可能会多次调用以发布 接收缓冲区以准备 传入数据和发送函数 可以多次调用以排队 向上发送多个缓冲区。注意 虽然一系列重叠发送 缓冲区将按顺序发送 提供,相应的完成 适应症可能发生在不同的 次序。同样,在接收时 侧,缓冲区将填充在 订购它们,但是 完成指示可能出现在 不同的顺序。

毫不奇怪,同样的保证会延续到世界的管理方面,例如NetworkStream类:

读取和写入操作可以是 同时在 网络流类的实例 无需同步。 只要有一个唯一的线程 对于写入操作和一个 用于读取操作的唯一线程, 不会有交叉干扰 在读取和写入线程之间,并且没有 需要同步。

话虽如此,在 Stream 上随机抛出异步读取和写入将很快导致混乱。应用程序需要仔细协调线程提交操作的顺序,以便顺序是确定的。通常,这意味着将记帐保存在(同步)列表中,并在保持同步锁的同时特别注意执行异步操作调用。

最后需要注意的是,所有这些异步 API 都特别指出,完成顺序不能保证与提交顺序匹配。

否,文件流不支持多个并发 IO。Windows文件系统不能很好地处理。它几乎肯定会引发异常。

编辑:

同步和重叠

的输入和输出似乎表明文件系统将正确处理多个重叠的 IO 请求。我的坏。

但是,不要尝试对 FileStream 执行并发同步写入。这将引发异常。

相关内容

  • 没有找到相关文章

最新更新