原:自译MSDN片断---同步和重叠I/O

 这几天因工作需要而关心网络程序,以前从未写过,凭着以前看书的一点印象和MSDN,也写了一个出来,但使用时才发现效率极低.我是用同步SOCKET加select函数写的.这两天在网上看了SOCKET编程六个模型之类的文章,现在看是选择了一个最差的模型,因此下定决心要把重叠IO和完成端口搞清楚.必须不能白花这么几天功夫,总得学点什么东西才行.在看MSDN时,为加深理解和记忆,随手翻译了一些片断,将陆续贴出来.译得不好,基本是直译的,如果看不懂,还请参考原文; 如果转载,请连译者名字转,呵呵.

标题:MSDN片断---同步和重叠I/O
来源:MSDN2005(ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/dllproc/base/synchronization_and_overlapped_input_and_output.htm)
译者:dwBreakHeart
时间:2008年3月25日
    你可以对文件、命名管道和串行通信设备进行同步或异步(或重叠)I/O操作。WriteFile、ReadFile、DeviceIoControl、WaitCommEvent、ConnectNamedPipe和TransactNamedPipe函数即可以同步执行也可以异步执行。ReadFileEx和WriteFileEx函数只有异步执行。
    当函数同步执行时,它直到操作完成后才返回。这意味着调用线程在等待一个耗时的操作完成时会堵塞不确定的时间。而执行重叠操作的函数能够立即返回,即使操作还未完成。使得耗时的I/O操作在后台执行,而调用线程可以自由地干其它工作。例如,单个线程可以对不同的句柄进行并发I/O操作,或者甚至对同一个句柄同时进行读写操作。
    要使执行和重叠操作的完成同步,调用线程可以用GetOverlappedResult函数或wait函数来判断重叠操作何时完成。还可以用HasOverlappedIoCompleted宏测试是否完成。
    要取消所有未完成的异步I/O操作,用CancelIo函数。该函数仅取消调用线程发出的针对特定文件句柄的操作。
    重叠操作要求文件、命名管道或通信设备在建立时使用FILE_FLAG_OVERLAPPED标志。要调用一个函数执行重叠操作,调用线程必须指定一个指向OVERLAPPED结构的指针且该结构的所有成员必须初始化为零。如果指针为NULL,函数返回值可能错误地指示操作已经完成。当I/O函数调用在操作未完成之前返回时,系统将事件对象的状态设成未激活。当操作结束时,系统将事件对象的状态设成激活。
    函数在来执行重叠操作时,有可能操作会在函数返回前完成。如果有这种情况,结果会被当做象同步执行一样来处理。但是,如果操作未完成,函数返回值是FALSE,而GetLastError函数返回ERROR_IO_PENDING。
线程可以用两种方法来管理重叠操作:
用GetOverlappedResult函数等待重叠操作结束。
在wait函数中指定OVERLAPPED结构的人工重置事件对象句柄,当wait函数返回时调用GetOverlappedResult函数。GetOverlappedResult函数函数返回已完成的重叠操作的结果,当函数需要时,它报告被传输的字节数。
    在同时执行多个重叠操作时,调用线程必须为每个操作指定一个带不同人工重置事件对象的OVERLAPPED结构。要等待其中任何一个重叠操作完成,线程可以在一个多对象wait函数中指定所有的人工重置事件句柄。多对象wait函数的返回值指示哪个事件对象被激活,因此线程就可以判断哪个重叠操作导致wait完成。
如果在OVERLAPPED结构中没有指定事件对象,系统会在重叠操作完成时激活文件、命名管理或通信设备的状态。因此,可以在wait函数中将这些句柄做为同步对象使用,尽管这样做难于管理。当对同一个文件、命名管理或通信设备执行并发多个重叠操作时,没有办法来确定到底是哪个操作导致对象的状态被激活。最好是对每个重叠操作使用一个独立的事件对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值