临界区写的锁 和 数据安全类型模板类

#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作用的使用例子,谢谢!

你可能感兴趣的:(临界区写的锁 和 数据安全类型模板类)