每个_Kthread都有一个成员Alerted,默认为0,表示是否可以被APC唤醒。所以下面这段程序,即使插入了APC,但是t线程仍然不会执行。
让t线程执行APC函数的方法是使t线程变成可被唤醒状态,使用函数SleepEx(时间,是否可以唤醒线程),第二个参数为true,Alerted设置为1,即可被唤醒;在插入APC时,APC函数就会执行。
#include "stdafx.h"
#include<Windows.h>
DWORD WINAPI threadProc(LPVOID p)
{
for (size_t i = 0; i < 1000; i++)
{
Sleep(200);
/*SleepEx(200,1);*/
printf("ttt\n");
}
return 0;
}
VOID WINAPI apcc(ULONG_PTR p)
{
printf("APC*********************\n");
}
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE t = CreateThread(NULL, 0, threadProc, 0, 0, 0);
Sleep(5000);//让主线程等待一段时间,否则不一定能把apc插入到t线程。
/*SleepEx(1000, 1);*/
QueueUserAPC((PAPCFUNC)apcc, t, 0);
printf("Pause\n");
system("pause");
return 0;
}
执行结果: