封装类的头文件:
// CriticalSection.h: interface for the CCriticalSection class.
//
//
#if !defined(AFX_CRITICALSECTION_H__2C56C0EA_7294_4BB9_A4E7_38D28DA96925__INCLUDED_)
#define AFX_CRITICALSECTION_H__2C56C0EA_7294_4BB9_A4E7_38D28DA96925__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <windows.h>
class CCriticalSection
{
public:
void UnLock(void);
void Lock(void);
CCriticalSection();
virtual ~CCriticalSection();
CRITICAL_SECTION cs;
};
#endif // !defined(AFX_CRITICALSECTION_H__2C56C0EA_7294_4BB9_A4E7_38D28DA96925__INCLUDED_)
封装类的实现文件:
// CriticalSection.cpp: implementation of the CCriticalSection class.
//
//
#include "CriticalSection.h"
//
// Construction/Destruction
//
CCriticalSection::CCriticalSection()
{
InitializeCriticalSection(&cs);
}
CCriticalSection::~CCriticalSection()
{
DeleteCriticalSection(&cs);
}
void CCriticalSection::Lock()
{
EnterCriticalSection(&cs);
}
void CCriticalSection::UnLock()
{
LeaveCriticalSection(&cs);
}
封装类使用的例子代码:
#include <windows.h>
#include <iostream.h>
#include "CriticalSection.h"
DWORD WINAPI fun1Proc(LPVOID lpParamter);
DWORD WINAPI fun2Proc(LPVOID lpParamter);
int g_tickets = 100;
CRITICAL_SECTION g_cs;//全局的原因是多个线程都在使用
CCriticalSection *g_ccs;
void main()
{
HANDLE hThread1 = CreateThread(NULL,0,fun1Proc,NULL,0,NULL);
HANDLE hThread2 = CreateThread(NULL,0,fun2Proc,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
//InitializeCriticalSection(&g_cs);
g_ccs = new CCriticalSection();
Sleep(1000 * 4);
//DeleteCriticalSection(&g_cs);
delete g_ccs;
}
DWORD WINAPI fun1Proc(LPVOID lpParamter)
{
while (TRUE)
{
//EnterCriticalSection(&g_cs);
g_ccs->Lock();
if (g_tickets >0)
{
cout<<"the Thread1 sall tickets is "<<g_tickets--<<endl;
}
else
{
break;
}
g_ccs->UnLock();
//LeaveCriticalSection(&g_cs);
}
return 0;
}
DWORD WINAPI fun2Proc(LPVOID lpParamter)
{
while (TRUE)
{
// EnterCriticalSection(&g_cs);
g_ccs->Lock();
if (g_tickets > 0)
{
cout<<"The Thread2 sall tickets is "<<g_tickets--<<endl;
}
else
{
break;
}
// LeaveCriticalSection(&g_cs);
g_ccs->UnLock();
}
return 0;
}