Cal*_*ius 6 c# io multithreading asynchronous concurrent-programming
我正在使用异步I/O,因为它不会阻塞调用线程并在幕后执行线程处理.如果我在同一个Stream上调用多个异步操作(如BeginWrite()),我是否需要担心数据缓冲区内容是否混合在一起?
我们假设我想发送3个缓冲区:
Buffer1: 1111111111
Buffer2: 2222222222
Buffer3: 3333333333
Run Code Online (Sandbox Code Playgroud)
我不介意缓冲区是否以错误的顺序发送,所以
333333333311111111112222222222
Run Code Online (Sandbox Code Playgroud)
没问题,但缓冲内容是否可能完全混合在一起?
122213121212122333313111223333
Run Code Online (Sandbox Code Playgroud)
PS:我100%肯定有人已经以某种形式问过这个......
这取决于Stream的实现.例如,套接字支持读取和写入的多个重叠请求,文件API也是如此.它们保证每个操作的一致性(没有交错内容)以及操作顺序:例如,对于套接字读取,接收的字节将被放置在发布的订单中发布的缓冲区中.如果将不被提供这些保证它将不可能写高性能网络应用,如重叠发送被期望的,但重叠可以接收实际需要高性能网络IO.许多文章都描述了这种行为,包括好的' Windows套接字2.0:使用完成端口编写可扩展的Winsock应用程序,并在MSDN 重叠输入/输出上记录:
发送和接收操作都可以重叠.可以多次调用接收函数以发布接收缓冲区以准备输入数据,并且可以多次调用发送函数以排队要发送的多个缓冲区.请注意,虽然将按所提供的顺序发送一系列重叠的发送缓冲区,但相应的完成指示可能以不同的顺序发生.同样,在接收方,缓冲区将按它们提供的顺序填充,但完成指示可能以不同的顺序发生.
毫不奇怪,同样的保证会延续到世界的管理方面,例如.在NetworkStream类:
可以在NetworkStream类的实例上同时执行读写操作,而无需同步.只要有一个用于写操作的唯一线程和一个用于读操作的唯一线程,读写线程之间就不会存在交叉干扰,也不需要同步.
话虽这么说,在Stream上随机抛出异步读写会很快导致混乱.应用程序需要仔细协调线程提交操作的顺序,以使订单具有确定性.通常这意味着在保持同步锁的同时特别注意在(同步)列表中进行记帐以执行异步操作调用.
最后要注意的是,所有这些异步API都在特别说明,确保完成顺序不能保证与提交顺序相匹配.
| 归档时间: |
|
| 查看次数: |
2140 次 |
| 最近记录: |