#pragma once
#include <windows.h>
//使用临界区做的锁
//作用:可被第三方聚合,进行同步处理
class CLock
{
CRITICAL_SECTION m_sec;
public:
CLock()
{
::InitializeCriticalSection(&m_sec);
}
virtual ~CLock()
{
::DeleteCriticalSection(&m_sec);
}
void Lock()
{
::EnterCriticalSection(&m_sec);
}
void UnLock()
{
::LeaveCriticalSection(&m_sec);
}
};
//使用临界区 锁定
//供安全类型模板类使用
class CCSLock
{
CRITICAL_SECTION& m_sec;
public:
//从临界区引用创建
CCSLock(CRITICAL_SECTION &sec) : m_sec(sec)
{
Lock();
}
~CCSLock()
{
UnLock();
}
void Lock()
{
::EnterCriticalSection(&m_sec);
}
void UnLock()
{
::LeaveCriticalSection(&m_sec);
}
};
//安全类型模板类
//可以通过模板函数封装出类型安全的整数,枚举等简单变量
template<typename T>
class CSafeType
{
private:
CRITICAL_SECTION m_sec;
public:
CSafeType()
{
::InitializeCriticalSection(&m_sec);
}
virtual ~CSafeType()
{
::DeleteCriticalSection(&m_sec);
}
void WaitUnitl(T t)
{
while(true)
{
CCSLock tempVal(m_sec);
if(m_data== t)
break;
Sleep(10);
}
}
operator T()
{
CCSLock tempVal(m_sec);
return (m_data);
}
T operator =(T& t)
{
CCSLock tempVal(m_sec);
m_data = t;
return m_data;
}
T operator =(const T& t)
{
CCSLock tempVal(m_sec);
m_data = t;
return m_data;
}
bool operator ==(T t)
{
CCSLock tempVal(m_sec);
return m_data == t;
}
bool operator !=(T t)
{
CCSLock tempVal(m_sec);
return m_data != t;
}
bool operator <(T t)
{
CCSLock tempVal(m_sec);
return m_data < t;
}
bool operator <=(T t)
{
CCSLock tempVal(m_sec);
return m_data <= t;
}
bool operator >(T t)
{
CCSLock tempVal(m_sec);
return m_data > t;
}
bool operator >=(T t)
{
CCSLock tempVal(m_sec);
return m_data >= t;
}
T m_data;
};
其中,对于CSafeType使用下面提供一个不怎么好的例子:
#include "Locker.h"
#include <iostream>
#include<conio.h>
#include <windows.h>
using namespace std;
CSafeType<DWORD> testData;
DWORD WINAPI WriteData(void *p)
{
while(1)
{
testData = GetTickCount();
Sleep(1);
}
return 0;
}
DWORD WINAPI ReadData(void *p)
{
while(1)
{
cout<<testData<<endl;
Sleep(1);
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hWrite, hRead;
DWORD dwWrite, dwRead;
hWrite = CreateThread(NULL, 0, WriteData, NULL, 0, &dwWrite);
hRead = CreateThread(NULL, 0, ReadData, NULL, 0, &dwRead);
while(!_kbhit())
Sleep(10);
CloseHandle(hWrite);
CloseHandle(hRead);
return 0;
}
希望哪位高人给出更能说明CSafeType作用的使用例子,谢谢!