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

C/C++
C/C++:小编谈C语言函数那些事(3)
C/C++:小编谈C语言函数那些事(4)
C/C++:小编谈C语言函数那些事(5)
C/C++:小编谈C语言函数那些事(6)
C/C++:小编谈C语言函数那些事(7)
C/C++:小编谈C语言函数那些事(8)
C/C++:小编谈C语言函数那些事(9)
C/C++:小编谈C语言函数那些事(10)
C/C++:小编谈C语言函数那些事(11)
C/C++:小编谈C语言函数那些事(12)
C/C++:小编谈C语言函数那些事(13)
C/C++:小编谈C语言函数那些事(14)
C/C++:小编谈C语言函数那些事(15)
C/C++:小编谈C语言函数那些事(16)
C/C++:小编谈C语言函数那些事(17)
C/C++:小编谈C语言函数那些事(18)
C/C++:小编谈C语言函数那些事(19)
C/C++:小编谈C语言函数那些事(20)
C/C++:小编谈C语言函数那些事(21)
C/C++:小编谈C语言函数那些事(22)

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 88 ::
收藏到网摘: 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)