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

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

转载于:https://my.oschina.net/u/262868/blog/66539

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值