这两天在看APC的东西,顺便写个总结:
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队列的长度就可以增长。