CreateFile

SetFilePointerEx
SetEndOfFile
FlushFileBuffers 类似FILE_FLAG_WRITE_THROUGH功能

在异步I/O请求完成之前,一定不能移动或是销毁在发出I/O请求时所使用的数据缓存和OVERLAPPED结构。

BOOL WINAPI CancelIo(
  __in  HANDLE hFile
);
取消同给定句柄所标识的线程添加到队列中的所有I/O请求(除非该句柄具有与之相关联的I/O完成端口)
BOOL WINAPI CancelIoEx(
  __in      HANDLE hFile,
  __in_opt  LPOVERLAPPED lpOverlapped
);
取消指定I/O请求,如lpOverlapped为NULL,取消所有

可置线程为可提醒状态的函数:
SleepEx/WaitForSingleObjectEx/WaitForMultipleObjectsEx/SignalObjectAndWait/GetQueuedCompletionStatusEx/MsgWaitForMultipleObjectsEx
bAlertable 为TRUE, 不带Ex的函数实际是调用Ex并传入FLASE。

调用这6个函数,系统会先检查APC队列有没有项,如有,系统不会让线程进入睡眠状态。没有时才会挂起
当系统创建一个线程的时候,会同时创建一个与线程相关联的队列,这个队列被称为异步过程调用APC

DWORD WINAPI QueueUserAPC(
  __in  PAPCFUNC pfnAPC,
  __in  HANDLE hThread,
  __in  ULONG_PTR dwData
);
手动加入一项到APC队列

用来接收I/O完成通知的方法
1.触发设备内核对象
2.触发事件内核对象
3.使用可提醒I/O
4.使用I/O完成端口

#include <Windows.h>
#include <stdio.h>
#include <process.h>void DeviceObject()
{//FILE_FLAG_WRITE_THROUGH Instructs the system to write through any intermediate cache and go directly to disk. The system can still cache write operations, but cannot lazily flush them. //FILE_FLAG_DELETE_ON_CLOSE CloseHandle will delete this temp file.HANDLE hFile = CreateFileW(L"c:\\test\\temp.txt",GENERIC_READ|GENERIC_WRITE|FILE_SHARE_DELETE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_TEMPORARY|FILE_FLAG_DELETE_ON_CLOSE|FILE_FLAG_OVERLAPPED,NULL);wchar_t buf[11] = L"1234567890";OVERLAPPED ov = { 0 };ov.Offset = 3;BOOL bWriteDoned = WriteFile(hFile,buf,8*sizeof(wchar_t),NULL,&ov);DWORD dw = GetLastError();if( !bWriteDoned && (dw == ERROR_IO_PENDING) ){wprintf(L"dw == ERROR_IO_PENDING.\n");WaitForSingleObject(hFile, INFINITE);bWriteDoned = TRUE;}if(bWriteDoned){wprintf(L"write over.\n");}else{wprintf(L"other fail.\n");}
}void TrrigEvent()
{HANDLE hFile = CreateFileW(L"c:\\test\\temp.txt",GENERIC_READ|GENERIC_WRITE|FILE_SHARE_DELETE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_TEMPORARY/*|FILE_FLAG_DELETE_ON_CLOSE*/|FILE_FLAG_OVERLAPPED,NULL);wchar_t buf[11] = L"1234567890";OVERLAPPED ovWrite = { 0 };ovWrite.Offset = 3;ovWrite.hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);BOOL bWriteDoned = WriteFile(hFile,buf,8*sizeof(wchar_t),NULL,&ovWrite);BYTE bufRead[20];OVERLAPPED ovRead = { 0 };ovRead.Offset = 6;ovRead.hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);ReadFile(hFile,bufRead,20,NULL,&ovRead);HANDLE hEvent[2] = { ovWrite.hEvent, ovRead.hEvent };bool bWrite = true, bRead = true;do{DWORD dw = WaitForMultipleObjects(2,hEvent,FALSE,INFINITE);switch( dw - WAIT_OBJECT_0 ){case 0:{wprintf(L"Write completed.\n");bWrite = false;break;}case 1:{wprintf(L"Read completed.\n");bRead = false;break;}}}while(bWrite | bRead);
}VOID WINAPI APCFunc(ULONG_PTR dwParam)
{dwParam;
}
unsigned __stdcall ThreadFunc( void* pArguments )
{HANDLE hEvent = (HANDLE)pArguments;//Waits until (1)the specified object is in the signaled state, //           (2)an I/O completion routine or asynchronous procedure call (APC) is queued to the thread, //           (3)or the time-out interval elapses.DWORD dw = WaitForSingleObjectEx(hEvent,5000,TRUE);switch( dw ){case WAIT_OBJECT_0:{wprintf(L"Event is signaled.\n");break;}case WAIT_IO_COMPLETION:{wprintf(L"IO completed.\n");break;}case WAIT_TIMEOUT:{wprintf(L"timeout.\n");break;}}_endthreadex( 0 );return 0;
} void AlertableIO()
{HANDLE hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);HANDLE hThread = (HANDLE)_beginthreadex( NULL, 0, &ThreadFunc, hEvent, 0, NULL );//; //(1)will timeoutSleep(1);   //make sure thread function have run to WaitForSingleObjectEx function.QueueUserAPC(APCFunc,hThread,NULL); //(2)will IO completed//SetEvent(hEvent); // (3)will signaledWaitForSingleObject( hThread, INFINITE );CloseHandle(hThread);CloseHandle(hEvent);
}void main()
{//DeviceObject();//getchar();//TrrigEvent();//getchar();AlertableIO();getchar();
}

异步I/O 设备内核对象,事件内核对象,可提醒I/O 接收I/O通知相关推荐

  1. JavaScript重难点解析5(对象高级、浏览器内核与事件循环模型(js异步机制))

    JavaScript重难点解析5(对象高级.浏览器内核与事件循环模型(js异步机制) 对象高级 对象创建模式 Object构造函数模式 对象字面量模式 工厂模式 自定义构造函数模式 构造函数+原型的组 ...

  2. Chapter09-内核模式下的线程同步之事件内核对象

    有两种事件内核对象:自动事件和手动事件.当手动事件被触发时,所以该事件的等待线程都编程可调度状态:而自动事件被触发时,只有个一个等待该事件线程变成可调度状态. 下面再逐个讲解Event的相关函数: a ...

  3. 线程同步-事件内核对象

    事件内核对象:两种状态,受信状态与未受信状态,3个成员: nUsageCount(使用计数): bManualReset(是否人工重置): bSignagled(是否受信). 基本函数: HANDLE ...

  4. 事件内核对象 CreateEvent

    事件内核对象是在线程同步时比较常用的内核对象. 一个事件内核对象的触发表示一个操作已经完成.有两种类型的事件内核对象:手动重置事件和自动重置事件. 当一个手动重置对象被触发的时候,正在等待该事件的所有 ...

  5. Windows进程同步之事件内核对象(Event)

    在所有的内核对象中,事件内核对象比其他的简单的多,可以用事件内核对象对不同进程进行同步. 事件内核对象主要包括三个部分:使用计数,一个表示是自动还是手动重置事件的布尔值,一个表示是否有信号的布尔值. ...

  6. 线程同步--事件内核对象

    现实程序中有时候我们需要对线程执行顺序更加严格的要求. 前面讲到的关键代码段就不适用了. 关键代码段最大的有点就是用户在用户态执行就可以了,不需要进入内核状态.从而减少了进入内核所用的时间. 所以如果 ...

  7. 嵌入式Linux设备驱动程序:编写内核设备驱动程序

    嵌入式Linux设备驱动程序:编写内核设备驱动程序 Embedded Linux device drivers: Writing a kernel device driver 编写内核设备驱动程序 最 ...

  8. Linux内核基础--事件通知链(notifier chain)【转】

    转自:http://blog.csdn.net/wuhzossibility/article/details/8079025 内核通知链 1.1. 概述 Linux内核中各个子系统相互依赖,当其中某个 ...

  9. linux 内核uevent事件,Linux的uevent事件机制

    uevent事件机制 Linux设计了一种uevent的机制.当有新的设备加入的时候,将设备的信息发送消息到用户态.而用户态有一个udev的进程监听这个信息.当收到信息后做一定的解析,根据解析到的结果 ...

最新文章

  1. Gitlab+Jenkins学习之路(三)之gitlab权限管理--issue管理
  2. 【数据库】将Excel导入达梦数据库,并执行表合并
  3. 电磁场与电磁波第二章 电磁场的基本规律
  4. 全球及中国5-氯-2-羟基苯甲酸产业专项调研与投资潜力预测报告2022-2028年
  5. Java黑皮书课后题第8章:*8.22(偶数个1)编写一个程序,产生一个6*6的填满0和1的二维矩阵,显示该矩阵,检测是否每行以及每列中有偶数个1
  6. Perl 教学 Perl5中的引用(指针)
  7. 关于LayUI单选框渲染checked属性不生效的问题
  8. 奥林匹克数学竞赛教练员汇编,最牛奥数资料全集!
  9. 从头学习计算机网络_我如何通过从头开始构建网络爬虫来自动进行求职
  10. 凯兑换系统服务器角色,能够在所有局中通用的角色,游走于各个线路,单挑很强的凯...
  11. 程序员如何坚持写作? 1
  12. 七、VueJs 填坑日记之渲染一个列表
  13. 友盟分享Title设置
  14. 二极管计算机原理,TVS二极管原理及其应用电路图
  15. 美通企业日报 | 爱彼迎成为奥林匹克全球合作伙伴;腾讯理财通运营主体迁至腾富公司...
  16. linux系统添加中文字体后不生效
  17. pacman 查询_pacman (简体中文)
  18. 单盘位小先锋 群晖DS112j家用NAS评测
  19. 力扣第236题“二叉树的最近公共先祖”的解题思路
  20. python海龟图画皮卡丘_用python画一只皮卡丘

热门文章

  1. ML之DL:机器学习领域发展最快的分支【深度学习】的发展史及其重要性节点之详细攻略
  2. CSDNmarkdown编辑器直接写代码的小效果(一生愿)
  3. 20190110-用笨办法找到二维矩阵的鞍点
  4. 安卓手机开机键失灵,FASTBOOT模式ADB重启
  5. spring IOC 注解@Autowired
  6. Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果
  7. 逻辑分析仪抓取CAN总线数据
  8. 编译Bitcoin BCH configure: error: libdb_cxx headers missing ,终于解决了
  9. java练气期(3)----java高级(网络编程)
  10. 2022年美国大学生数学建模竞赛各题型常见参考代码汇总