1 2 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