当前位置: 首页 > 图文教程 > 开发语言 > C/C++ > 多线程安全的变量模板

C/C++
任意分布的随机数的产生方法—VC程序实现方法
用Visual C++实现PDF文件的显示
利用Visual C#打造一个平滑的进度条
C/C++ 程序设计员应聘常见面试试题深入剖析
什么是sdk?

C/C++ 中的 多线程安全的变量模板


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 89 ::
收藏到网摘: n/a

  这里,东楼给出多线程安全的变量模板,由此模板,可派生绝大多数变量类型,实现线程间各种变量的安全互访。本模板已经重载了几乎全部运算符,大家可以很方便地使用++、――、+=、-=等操作,方便编程使用。

#ifndef _XiaoGeMVarTempleteHasBeenDefined_
#define _XiaoGeMVarTempleteHasBeenDefined_
#include <Afxmt.h>

template <class MVAR_TYPE>
class MVAR
{
public:
  MVAR()
  {
    m_pBegin=new char[sizeof(MVAR_TYPE)];
    memset(m_pBegin,0,sizeof(MVAR_TYPE));
  }
  ~MVAR(){delete[] m_pBegin;}
  int GetLength(){return sizeof(MVAR_TYPE);}
  MVAR_TYPE Set(MVAR_TYPE& value)
  {
    m_csLockHandle.Lock();
    memcpy(m_pBegin,(char*)&value,sizeof(MVAR_TYPE));
    m_csLockHandle.Unlock();
    return value;
  }
  MVAR_TYPE Get()
  {
    MVAR_TYPE myValue;
    m_csLockHandle.Lock();
    memcpy((char*)&myValue,m_pBegin,sizeof(MVAR_TYPE));
    m_csLockHandle.Unlock();
    return myValue;
  }
  MVAR_TYPE operator=(MVAR_TYPE value)
  {
    MVAR_TYPE myValue;
    m_csLockHandle.Lock();
    myValue=value;
    memcpy(m_pBegin,(char*)&myValue,sizeof(MVAR_TYPE));
    m_csLockHandle.Unlock();
    return myValue;
  }
  MVAR_TYPE operator~()
  {
    MVAR_TYPE myValue;
    m_csLockHandle.Lock();
    memcpy((char*)&myValue,m_pBegin,sizeof(MVAR_TYPE));
    myValue=~myValue;
    m_csLockHandle.Unlock();
    return myValue;
  }
  MVAR_TYPE operator++(int)
  {
    MVAR_TYPE myValue;
    m_csLockHandle.Lock();
    memcpy((char*)&myValue,m_pBegin,sizeof(MVAR_TYPE));
    myValue++;
    memcpy(m_pBegin,(char*)&myValue,sizeof(MVAR_TYPE));
    m_csLockHandle.Unlock();
    return myValue;
  }
  MVAR_TYPE operator++()
  {
    MVAR_TYPE myValue;
    m_csLockHandle.Lock();
    memcpy((char*)&myValue,m_pBegin,sizeof(MVAR_TYPE));
    myValue++;
    memcpy(m_pBegin,(char*)&myValue,sizeof(MVAR_TYPE));
    m_csLockHandle.Unlock();
    return myValue;
  }
  MVAR_TYPE operator--(int)
  {
    MVAR_TYPE myValue;
    m_csLockHandle.Lock();
    memcpy((char*)&myValue,m_pBegin,sizeof(MVAR_TYPE));
    myValue--;
    memcpy(m_pBegin,(char*)&myValue,sizeof(MVAR_TYPE));
    m_csLockHandle.Unlock();
    return myValue;
  }
  MVAR_TYPE operator--()
  {
    MVAR_TYPE myValue;
    m_csLockHandle.Lock();
    memcpy((char*)&myValue,m_pBegin,sizeof(MVAR_TYPE));
    myValue--;
    memcpy(m_pBegin,(char*)&myValue,sizeof(MVAR_TYPE));
    m_csLockHandle.Unlock();
    return myValue;
  }
  MVAR_TYPE operator+(MVAR_TYPE value)
  {
    MVAR_TYPE myValue;
    m_csLockHandle.Lock();
    memcpy((char*)&myValue,m_pBegin,sizeof(MVAR_TYPE));
    myValue+=value;
    m_csLockHandle.Unlock();
    return myValue;
  }
  MVAR_TYPE operator-(MVAR_TYPE value)
  {
    MVAR_TYPE myValue;
    m_csLockHandle.Lock();
    memcpy((char*)&myValue,m_pBegin,sizeof(MVAR_TYPE));
    myValue-=value;
    m_csLockHandle.Unlock();
    return myValue;
  }
  MVAR_TYPE operator*(MVAR_TYPE value)