您的位置:首页 > 其它

APC异步过程调用(Asynchronous Procedure Calls)

2013-09-25 16:14 288 查看
1 要注意在线程刚创建但还没开始第一次运行时(如果是给了CREATE_SUSPENDED就不会这样了),如果给线程投递APC(QueueUserAPC),那么只要APC函数没执行完,真正的线程函数就不会执行。大家可以写个例子,创建完线程立即给它不停的发APC,它将一直执行APC函数。

2 QueueUserAPC函数一般不会出错(参数正确的话),出错的话就是ERROR_NOT_ENOUGH_MEMORY。

3 当线程函数开始执行以后,如果进入了alertable state,则系统会检查线程的APC队列,如果队列中有东西,则依次执行里面的项,每执行一项就从队列中删除一项,当通过执行清空APC队列后线程函数中的等待函数就会返回,而不管等待的内核对象是否触发。返回结果是WAIT_IO_COMPLETION 。

4 如果线程函数是在等待多个内核对象,则只要执行并清空了一次APC队列后,该等待函数返回,返回值为WAIT_IO_COMPLETION 。当APC队列很长,很耗时时,在这期间如果等待的内核对象被触发了,等待函数也不会返回。只有APC队列清空后才会返回。

5 APC队列是在用户的地址空间分配内存的,只要你的内存够大,APC队列的长度就可以增长。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: