当前位置: 首页 > news >正文

最讨厌网站上海网站制作培训班

最讨厌网站,上海网站制作培训班,云指官网,美工培训去哪里学大家好#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
http://www.zqtcl.cn/news/374647/

相关文章:

  • 无锡做网站优化公司互动营销用在哪些推广上面
  • 每一个网站都是响应式吗销售渠道策略
  • 凡科平台网站怎么建设广州网站建设信科网络
  • 网站建设公司的服务特点seo实战密码电子书
  • 网站开发保密协议范本北京市建设工程信息网查询
  • 怎样跟网站做优化呢wordpress实现新闻列表
  • 济南手机网站定制费用wordpress安装文档下载
  • 麻涌镇网站仿做郑州做网页的公司
  • 做那个网站中山免备案网站建设
  • 软路由系统如何做网站全网营销式网站
  • 中国建设网官方网站视觉网站建设
  • 苏州乡村旅游网站建设策划书.docincapsula wordpress
  • 百度收录自适应网站滨海做网站哪家公司好
  • 东莞网站排名优化公司福田在线官网
  • 清湖网站建设天猫开店流程及费用2023
  • 邵阳建设网站公司网站建设构架
  • 怎样做网站卖网站网络营销概念
  • 怎样做网站能百度能搜到设计网站公司哪里好
  • 网站收缩栏专业定制网站公司
  • 烟台网站建设方案托管无锡网站制作企业
  • 网站网页是怎么做的用什么做网站 优化
  • 数据网站怎么做的网站开发的开题报告引言
  • 苏州专业网站制作设计做网站上海
  • 做网站可以用中文域名备案嘛山东省住房和城乡城乡建设厅网站
  • 网站建设推广多少钱站长工具seo综合查询关键词
  • 分类信息网站平台的推广做网站的花费
  • 还原wordpress站点地址恢复网站都要备案吗
  • 如何建立营销性企业网站论文如何修改wordpress
  • 全网营销销售郑州seo网站管理
  • dw怎么做网站首页邯郸网站建设品牌加盟