| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 
 | // CritcalSection.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include "windows.h"
 
class CriticalSection
{
	CRITICAL_SECTION m_criticalSection;
public :
	CriticalSection()
	{InitializeCriticalSection(&m_criticalSection);}
	~CriticalSection()
	{DeleteCriticalSection(&m_criticalSection);}
	void enter()
	{ EnterCriticalSection(&m_criticalSection);}
	void leave()
	{ LeaveCriticalSection(&m_criticalSection);}
};
 
CriticalSection	cs;
 
int data = 0;
 
void accessSecData(int id) {
	cs.enter();
	data++;
	char str[255];
	sprintf_s( str, sizeof(str), "IdThread=%d\n", id);
	printf( str );
	Sleep(1000);
	cs.leave();
}
 
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
	int *id = (int*)lpParameter;
	accessSecData(*id);
	return 0;
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
	CriticalSection	cs;
 
	DWORD dwThreadID;
	int t1 = 1;
	int t2 = 2;
	int t3 = 3;
	HANDLE thread1 = CreateThread( (LPSECURITY_ATTRIBUTES) NULL,
                   0,
                   (LPTHREAD_START_ROUTINE) ThreadProc,
                   (LPVOID) &t1,
                    0, &dwThreadID );
	HANDLE thread2 = CreateThread( (LPSECURITY_ATTRIBUTES) NULL,
                   0,
                   (LPTHREAD_START_ROUTINE) ThreadProc,
                   (LPVOID) &t2,
                    0, &dwThreadID );
	HANDLE thread3 = CreateThread( (LPSECURITY_ATTRIBUTES) NULL,
                   0,
                   (LPTHREAD_START_ROUTINE) ThreadProc,
                   (LPVOID) &t3,
                    0, &dwThreadID );
 
	::WaitForSingleObject( thread1, INFINITE );
	::WaitForSingleObject( thread2, INFINITE );
	::WaitForSingleObject( thread3, INFINITE );
	return 0;
} | 
Partager