做网站优化有必要,网站开发使用数据库的好处,乐清市住房和城乡建设规划局网站,南昌it培训机构转自#xff1a;http://blog.sina.com.cn/s/blog_c2ef450f010192hx.html APC 异步过程调用 记得第一次看见这个名词的时候#xff0c;觉得云里雾罩#xff0c;然而上网看了下它的介绍#xff0c;感觉说的都是没头没脑的 然而今天#xff0c;我再次接触了它#xff0c;我将… 转自http://blog.sina.com.cn/s/blog_c2ef450f010192hx.html APC 异步过程调用 记得第一次看见这个名词的时候觉得云里雾罩然而上网看了下它的介绍感觉说的都是没头没脑的 然而今天我再次接触了它我将自己对其的理解写下若有不对欢迎指正(参照《windows核心编程 》第五版) 狼影 --------- 2013、10、18 好啦废话少说让我们进入正题: 首先我们应该明白的是在创建线程的时候这个所谓的APC就已经建立并且与线程相关联并且这个APC是个队列; 队列中项的产生: 那么是谁往队列里面添加内容呢这个就要说到设备驱动程序了现在是不是感觉不知所以然听我慢慢讲来 当一个线程发出一个I/O请求时(在这里我们讲的是异步I/O请求哦)设备驱动程序接收它的请求那么线程呢就执行自己剩下的工作(直到某一点它实在是执行不去(因为在这点必须要得到请求的I/O结果))那么设备驱动程序在执行完I/O请求后他怎么让线程直到他已经执行完I/O了呢 那就是它会在APC队列中添加一项,那么问题又来啦它又怎么会知道往这个线程中的APC队列中添加项呢嘿嘿这当然是线程告诉他的在哪告诉的呢当然是在发送I/O请求时告诉的在这我也不卖官司啦直接说啦,线程在请求I/O操作时用的是ReadFileEx()或者WriteFileEx()函数这两个函数在发送I/O请求的时候就告诉设备驱动程序说”嗨哥们你处理完我的请求后就把通知发送到我的APC队列中啊哥等你”; (当然这个队列项的内容就是那个完成函数的地址和在I/O请求时那个OVERLAPPED结构的地址(至于什么是完成函数和OVERLAPPED结构我想就不用多说了把)), 这下我们知道了APC队列中项的由来那么接下来我们要了解的是项的处理: 在项添加到APC队列中时它不会被马上处理,(线程在有其他任务处理的情况下不能被打断为了对线程APC队列中的项进行处理线程必须将自己置为可提醒状态) 那么什么是可提醒状态怎么才能设为可提醒状态呢 可提醒状态在我感觉他就是为了处理APC中的项而出来的概念因为在队列中有项的情况下线程会处理那些项而当APC队列中没有项的时候那么线程就会是挂起状态;(在我看来这里的可提醒应该是通知的意思就是通知APC队列中有项让它处理) 记住当且仅当线程的APC队列中一项都没有的情况下线程才会挂起 至于怎么让线程成为可提醒状态,windows为我们提供了6个函数 SleepEx() WaitForSingleObjectEx() WaitForMultiObjectEx() SignalObjectAndWait() GetQueuedCOmpletionStatusEx() MsgWaitForMultipleObjectEx() 前五个函数的参数中最后一个参数是个BOOl值表示调用线程是不是应该将自己置为可提醒状态 对于最后一个函数的最后一个参数我们应该使用MWMO_ALERTABLE标志来让线程进入可提醒状态 还有一点是当线程在挂起状态时将其唤醒的方法可以是等待内核对象的触发或者也可以在APC队列中出现一个项当一个项出现的情况下系统会唤醒我们的线程(通过回调函数)并清空队列然后函数会立即返回---线程不会再次进行睡眠状态来等待内核对象被触发