并发学习之:APC (异步过程调用)
2013-01-07 01:01
344 查看
一个简单的APC例子,对应于Windows 并发编程指南p124。
执行结果:
#include "stdafx.h" #include <stdio.h> #include <windows.h> VOID NTAPI ApcFunc(ULONG_PTR pValue) { printf("Hello, this is APC and the parameter value is %d\n", *((DWORD*)pValue)); delete (DWORD*)pValue; } DWORD WINAPI Thread_A_Proc(LPVOID) { printf("Thread A is waiting...\n"); // Note: hEvent never signals HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE/*bInitialState*/, NULL); // Wait till APC calls DWORD dwRet = WaitForSingleObjectEx(hEvent, INFINITE, TRUE /*bAlertable*/); if(dwRet == WAIT_IO_COMPLETION) printf("Hoho, A is waken up by APC call.\n"); CloseHandle(hEvent); return 0L; } DWORD WINAPI Thread_B_Proc(LPVOID hThread_A) { printf("Thread B will wake up Thread A in 3 sec...\n"); Sleep(3000); DWORD* dwData = new DWORD(2013); QueueUserAPC(ApcFunc, (HANDLE)hThread_A, (ULONG_PTR)dwData); return 0L; } int wmain(int argc, wchar_t * argv[]) { HANDLE handles[2] = {}; // 1) Create two thread: // A. Sleep and alertable wait. // B. Send a APC to A's APC queue. HANDLE hThread_A = handles[0] = CreateThread(NULL, 0, Thread_A_Proc, NULL, 0, NULL); HANDLE hThread_B = handles[1] = CreateThread(NULL, 0, Thread_B_Proc, hThread_A, 0, NULL); WaitForMultipleObjects(2, handles, TRUE, INFINITE); printf("Done!\n"); getchar(); }
执行结果:
Thread A is waiting... Thread B will wake up Thread A in 3 sec... Hello, this is APC and the parameter value is 2013 Hoho, A is waken up by APC call. Done!
相关文章推荐
- 并发学习之:APC (异步过程调用)
- 用户模式异步过程调用(APC)
- 用户模式异步过程调用(APC)
- WINDOWS硬件通知应用程序的常方法(五种方式:异步过程调用APC,事件方式VxD,消息方式,异步I/O方式,事件方式WDM)
- miranda-APC(异步过程调用)分析
- 使用异步过程调用(APC)实现模块注入
- 注入(2)--APC(Asynchronous Procedure Call)注入(异步过程调用)
- APC 异步过程调用
- 使用异步过程调用(APC)实现模块注入
- 通过异步过程调用(APC)注入DLL
- 异步过程调用(APC)——操作系统实现异步的原理
- 延迟过程调用/异步过程调用APC
- 一步步学习java并发编程模式之Active Object模式(二)java实现异步调用
- 使用异步过程调用(APC)实现模块注入
- 通过异步过程调用(APC)注入DLL
- APC异步过程调用
- 异步过程调用APC
- APC异步过程调用(Asynchronous Procedure Calls)
- APC异步过程调用
- 使用异步过程调用(APC)实现模块注入