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队列的长度就可以增长。
2 QueueUserAPC函数一般不会出错(参数正确的话),出错的话就是ERROR_NOT_ENOUGH_MEMORY。
3 当线程函数开始执行以后,如果进入了alertable state,则系统会检查线程的APC队列,如果队列中有东西,则依次执行里面的项,每执行一项就从队列中删除一项,当通过执行清空APC队列后线程函数中的等待函数就会返回,而不管等待的内核对象是否触发。返回结果是WAIT_IO_COMPLETION 。
4 如果线程函数是在等待多个内核对象,则只要执行并清空了一次APC队列后,该等待函数返回,返回值为WAIT_IO_COMPLETION 。当APC队列很长,很耗时时,在这期间如果等待的内核对象被触发了,等待函数也不会返回。只有APC队列清空后才会返回。
5 APC队列是在用户的地址空间分配内存的,只要你的内存够大,APC队列的长度就可以增长。
相关文章推荐
- win32多线程-异步过程调用(asynchronous Procedure Calls, APCs)
- APC -- Asynchronous Procedure Call 异步过程调用
- 异步过程调用(Asynchronous Procedure Calls,APCs)
- 注入(2)--APC(Asynchronous Procedure Call)注入(异步过程调用)
- win32多线程-异步过程调用(asynchronous Procedure Calls, APCs)
- 异步过程调用(Asynchronous Procedure Call)
- 异步过程调用(APC)
- 通过异步过程调用(APC)注入DLL
- 使用异步过程调用(APC)实现模块注入
- 异步过程调用APC
- 延迟过程调用/异步过程调用APC
- APC异步过程调用
- 使用异步过程调用(APC)实现模块注入
- 异步过程调用(APC)——操作系统实现异步的原理
- 通过异步过程调用(APC)注入DLL
- 通过异步过程调用(APC)注入DLL
- Windows异步过程调用(APC)
- 用户模式异步过程调用(APC)
- apc 异步过程调用无法抛到主线程的问题跟踪
- miranda-APC(异步过程调用)分析