CRITICAL_SECTION 学习

 

// Critsetion.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <process.h>
using namespace std;


CRITICAL_SECTION g_cs;
char name[]="zhangdongsheng";

unsigned __stdcall ThreadPoc1( void* pArguments)
{
	while (1)
	{
		EnterCriticalSection(&g_cs); //如果此处不对全局变量name进行加锁
		                             //那么输出结果将有可能出现不一致现象
		memset(name,0,sizeof(name));
		strcpy(name,"Thread1");
		Sleep(600);
		cout<<"Thread1 "<<name<<endl;
		LeaveCriticalSection(&g_cs);
	}

	return 0;
}
unsigned __stdcall ThreadPoc2( void* pArguments)
{
	while(1)
	{
		EnterCriticalSection(&g_cs);
		memset(name,0,sizeof(name));
		strcpy(name,"Thread2");
		Sleep(500);
		cout<<"Thread2 "<<name<<endl;
		LeaveCriticalSection(&g_cs);
	}

	return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
	InitializeCriticalSection(&g_cs);
	HANDLE hThread1=(HANDLE)_beginthreadex(NULL,0,ThreadPoc1,NULL,0,NULL);
	HANDLE hThread2=(HANDLE)_beginthreadex(NULL,0,ThreadPoc2,NULL,0,NULL);
	CloseHandle(hThread1);
	CloseHandle(hThread2);
	while(1)
	{
		Sleep(500);
	}
	DeleteCriticalSection(&g_cs);
	return 0;
}

不加锁会出现不一致的情况

加锁后:

posted @ 2012-03-27 17:37  瓜蛋  阅读(451)  评论(0编辑  收藏  举报