// 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; } |
不加锁会出现不一致的情况
加锁后: