临界区 例子 (多线程全局变量问题)

一个临界区的例子,,这是<计算机病毒揭秘与对抗>那书p122页的例子...

#include <stdio.h>
#include <windows.h>
#include <process.h>
BOOL g_bContinue = TRUE; //负责通知线程退出的标记变量
int g_nCount = 0;  //保存炸弹总数引爆装置
CRITICAL_SECTION g_cs; // 对存在同步问题的代码使用的临界区对象
UINT __stdcall ThreadFunc1(LPVOID); //负责安装炸弹的线程
UINT __stdcall ThreadFunc2(LPVOID); //负责引爆炸弹的线程
int main(int argc, char* argv[])
{
	UINT uId;
	HANDLE h[2]; 
	InitializeCriticalSection(&g_cs); // 初始化临界区对象
	h[0] = (HANDLE)_beginthreadex(NULL, 0, ThreadFunc1, NULL, 0, &uId);
	h[1] = (HANDLE)_beginthreadex(NULL, 0, ThreadFunc2, NULL, 0, &uId);
	// 等待500毫秒后通知两个计数线程结束,关闭句柄
	Sleep(500);
	g_bContinue = FALSE; //通知两个线程退出
	WaitForMultipleObjects(2, h, TRUE, INFINITE); //等待两个线程全部退出
	CloseHandle(h[0]); //关闭不用的线程句柄
	CloseHandle(h[1]); //关闭不用的线程句柄
	DeleteCriticalSection(&g_cs); // 删除临界区对象
	return 0;
}
UINT __stdcall ThreadFunc1(LPVOID)
{
	while(g_bContinue)  //线程继续
	{
		EnterCriticalSection(&g_cs); //进入临界区
		g_nCount++; 
		printf(" -> 装入一颗炸弹\n");
		LeaveCriticalSection(&g_cs); //出临界区
		
	}
	return 0;
}
UINT __stdcall ThreadFunc2(LPVOID)
{
	while(g_bContinue) //线程继续
	{ 
		EnterCriticalSection(&g_cs); //进入临界区
		printf("** 同时引爆 %d 颗炸弹\n\n", g_nCount);
		g_nCount = 0; 
		LeaveCriticalSection(&g_cs); //出临界区
	}
	return 0;
}

评论列表