最讨厌网站,上海网站制作培训班,云指官网,美工培训去哪里学大家好#xff0c;这里是我以xghome这个用户名#xff0c;02年在CSDN上发布的《多线程安全的变量模板》#xff0c;这次在《0bug -- C/C商用工程之道》一书中#xff0c;作为“资源锁”和多线程通信核心示例#xff0c;也再次出现。这个模板我当初大约写了19遍#xff0c… 大家好这里是我以xghome这个用户名02年在CSDN上发布的《多线程安全的变量模板》这次在《0bug -- C/C商用工程之道》一书中作为“资源锁”和多线程通信核心示例也再次出现。 这个模板我当初大约写了19遍写的有点长了为了给广大读者省点事我就把它粘贴过来了。嗯原帖在这里http://blog.csdn.net/xghome/archive/2002/05/28/15469.aspx xghome是我2005年以前在CSDN使用的用户名不过可惜密码搞忘了最要命的是注册的21cn的邮箱也被废除搞得我只有以tonyxiaohome这个用户名重出江湖。不过还是应该夸一句CSDN对用户名和密码的保护真的没话讲呵呵我怎么也没有办法恢复原用户名了。 嗯这段代码是我的代码我叫肖舸拼音缩写XG那个时侯还没用Tony.Xiao的英文名呢。大家注意了哈可不是我欺世盗名盗贴别人的帖子哈。 嗯还有个旁证我的《0bug -- C/C商用工程之道》一书详细论述了我产生“资源锁”的原始动机和想法这个模板主要就是基于“资源锁”在开发这个思路目前我起码没有看到有其他人有过从思路传承性上我证明哈这个东东是我的。呵呵。 文中代码很简单大家只要把核心的模板代码拷贝下来放到一个xgvar.h的头文件里面就可以用当然也可以是你喜欢的其他名字啦。不过注意啊这个模板代码在Windwos下可以使用Linux下是不可以的请关注别用错了。 多线程的变量同步问题一直是困扰广大VC程序员的一大难题其主要表现是在多线程模式下线程间共享变量的存取不再安全程序员无法确保变量的值在存取时是否准确可信对此微软给出的解决方案是使用临界区对象加以保护。但是临界区对象使用太过于繁琐需要不断地加锁和解锁很容易搞忘引起新的Bug。 这里东楼给出多线程安全的变量模板由此模板可派生绝大多数变量类型实现线程间各种变量的安全互访。本模板已经重载了几乎全部运算符大家可以很方便地使用、――、、等操作方便编程使用。 #ifndef _XiaoGeMVarTempleteHasBeenDefined_ #define _XiaoGeMVarTempleteHasBeenDefined_ #include Afxmt.h template class MVAR_TYPE class MVAR { public: MVAR() { m_pBeginnew 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(); myValuevalue; 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)); myValuevalue; 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) { 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)); myValuevalue; 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) { MVAR_TYPE myValue; m_csLockHandle.Lock(); memcpy((char*)myValue,m_pBegin,sizeof(MVAR_TYPE)); myValuevalue; 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; 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; 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; 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)); myValuevalue; 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; 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; memcpy(m_pBegin,(char*)myValue,sizeof(MVAR_TYPE)); m_csLockHandle.Unlock(); return myValue; } BOOL operator(MVAR_TYPE value) { MVAR_TYPE myValue; BOOL bRet; m_csLockHandle.Lock(); memcpy((char*)myValue,m_pBegin,sizeof(MVAR_TYPE)); bRet(myValuevalue); m_csLockHandle.Unlock(); return bRet; } BOOL operator(MVAR_TYPE value) { MVAR_TYPE myValue; BOOL bRet; m_csLockHandle.Lock(); memcpy((char*)myValue,m_pBegin,sizeof(MVAR_TYPE)); bRet(myValuevalue); m_csLockHandle.Unlock(); return bRet; } BOOL operator(MVAR_TYPE value) { MVAR_TYPE myValue; BOOL bRet; m_csLockHandle.Lock(); memcpy((char*)myValue,m_pBegin,sizeof(MVAR_TYPE)); bRet(myValuevalue); m_csLockHandle.Unlock(); return bRet; } BOOL operator(MVAR_TYPE value) { MVAR_TYPE myValue; BOOL bRet; m_csLockHandle.Lock(); memcpy((char*)myValue,m_pBegin,sizeof(MVAR_TYPE)); bRet(myValuevalue); m_csLockHandle.Unlock(); return bRet; } BOOL operator(MVAR_TYPE value) { MVAR_TYPE myValue; BOOL bRet; m_csLockHandle.Lock(); memcpy((char*)myValue,m_pBegin,sizeof(MVAR_TYPE)); bRet(myValuevalue); m_csLockHandle.Unlock(); return bRet; } BOOL operator!(MVAR_TYPE value) { MVAR_TYPE myValue; BOOL bRet; m_csLockHandle.Lock(); memcpy((char*)myValue,m_pBegin,sizeof(MVAR_TYPE)); bRet(myValue!value); m_csLockHandle.Unlock(); return bRet; } private: char* m_pBegin; CCriticalSection m_csLockHandle; }; typedef MVARchar MCHAR; typedef MVARunsigned char MUCHAR; typedef MVARshort MSHORT; typedef MVARunsigned short MUSHORT; typedef MVARint MINT; typedef MVARunsigned int MUINT; typedef MVARlong MLONG; typedef MVARunsigned long MULONG; typedef MVARfloat MFLOAT; typedef MVARdouble MDOUBLE; typedef MVARBOOL MBOOL; typedef MVARLPVOID MLPVOID; typedef MVARBYTE MBYTE; #endif //_XiaoGeMVarTempleteHasBeenDefined_ 大家只需要把这段代码放入Mvar.h文件在stdafx.h中include这个头文件即可在程序中自由使用变量。以上仅仅是东楼根据自己的需要派生的几个常用类型大家也可以尝试派生新的类型使用。 注意当派生的变量需要取得其中的值时必须使用.Get()成员函数这是唯一一点不如普通变量方便的地方。 下面给出一个控制例子大家可以参考 #includen “mvar.h” class CMyClass { public: CMyClass(); ~ CMyClass(); protected: static UINT MyThread(LPVOID pParam); //线程函数 MBOOL m_bThreadContinue; //线程循环标志 MUINT m_nThreadCount; //线程计数器 }; CMyClass::CMyClass() { m_bThreadContinueTRUE; m_nThreadCount0; int i; //开启100个线程 for(i0;i100;i) { m_nThreadCount; //一定要在开启线程前累加线程计数器 AfxBeginThread(MyThread,this); //开启线程以本对象指针为参数 } } CMyClass::~CMyClass() { m_bThreadContinueFALSE; //通知线程关闭 while(m_nThreadCount!0) {} //等待所有线程退出 //此时退出线程已经全部安全退出!!! } UINT CMyClass::MyThread(LPVOID pParam) { CMyClass* pThis(CMyClass*)pParam; //得到本对象指针 while(pThis-m_bThreadContinue) { //循环体 Sleep(100); } pThis-m_nThreadCount --; //线程计数器减1 return 0; } 如果有问题欢迎大家提问如果有Bug,也请大家及时向东楼提出。 在线底价购买《0bug-C/C商用工程之道》直接点击下面链接或拷贝到浏览器地址栏http://s.click.taobao.com/t_3?pmm_13866629_0_0n23lhttp%3A%2F%2Fsearch8.taobao.com%2Fbrowse%2F0%2Fn-g%2Corvv64tborsvwmjvgawdkmbqgboq---g%2Cgaqge5lhebbs6qzlfmqmttgtyo42jm6m22xllqa-------------1%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C10%2C11%2C12%2C13%2C14%2C15%2C16%2C17%2C18%2C19%2C20---40--coefp-0-all-0.htm%3Fpid%3Dmm_13866629_0_0肖舸 转载于:https://blog.51cto.com/tonyxiaohome/255366