并发学习之:APC (异步过程调用)

一个简单的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!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值