码迷,mamicode.com
首页 > 其他好文 > 详细

第10章 同步设备I/O和异步设备I/O(2)_同步IO和异步IO基础

时间:2015-08-27 22:45:21      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:

10.3 执行同步设备I/O

(1)对设备读写操作的函数

  ①ReadFile/WriteFile函数

参数

描述

hFile

文件句柄

pvBuffer

指向要接收文件数据的缓冲区或把缓冲区数据写入设备

nNumbytesToRead

要读取的字节数或写入的字节数

pdwNumBytes

实际读取的字节数或写入的字节数

pOverlapped

指向OVERLAPPED结构体。

①要进行同步读写时,该参数为NULL,同时打开设备的时候,标志不能指定为FILE_FLAG_OVERLAPPED。

②要进行异步读写时,须指定该参数,同时打开设备时设置FILE_FLAG_OVERLAPPED标志。

 【说明】

  ①要进行同步和异步的设置与最后一个参数pOverlapped的密切相关

  ②ReadFile只能用于哪些用GENERIC_READ打开的设备,同理WriteFile只能用于那些用GENERIC_WRITE标志打开的设备

(2)将数据刷新到设备

  ①在CreateFile函数时可通过传FILE_FLAG_NO_BUFFERING等标志来决定是否对数据进行缓存

  ②如果要强制将缓存数据写入设备可调用FlushFileBuffers函数,但要注意该设备要用GENERIC_WRITE标志打开。

(3)同步I/O的取消——CancelSynchronousIo(Vista以上版本才支持)

  ①与Read/WriteFile不同,CreateFile函数本身不能进行异步调用。如果等待时间太长,可以通过CancelSynchronousIo(hThread)来强制取消同步I/O操作并退出等待。

  ②参数hTread是由于等待同步I/O请求完成而被挂起的线程,这个句柄必须使用THREAD_TERMINATE访问权限创建,否则调用CancelSynchronousIo函数会失败。

  ③当调用CreateThread或_beginthreadex创建线程时,如果安全属性设为NULL,那么默认的权限是THREAD_IMPERSONATE

  ④当线程因等待同步I/O而被挂起,如果使用CancelSynchronousIo唤醒该线程,并取消同步操作。同时返回TRUE,但GetLastError将返回ERROR_OPERATION_ABORTED。

  ⑤调用CancelSynchronousIo的线程并不知道要唤醒的另一个线程目前的状态,如果这时另一个线程并不是因为要等待设备应被挂起,那么CancelSyncronousIo会返回FALSE,这时GetLastError将得到ERROR_NOT_FOUND。

10.4 异步设备I/0基础

10.4.1 OVERLAPPED结构

 

第10章 同步设备I/O和异步设备I/O(2)_同步IO和异步IO基础

标签:

原文地址:http://www.cnblogs.com/5iedu/p/4764640.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!