日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

多年以后重发:多线程安全的变量模板

發布時間:2025/3/8 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多年以后重发:多线程安全的变量模板 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
大家好,這里是我以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_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) { 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)); 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; 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)); 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; } 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; } 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; } 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; } 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; } 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; } 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 MVAR<char>????????????? MCHAR; typedef MVAR<unsigned char>?????? MUCHAR; typedef MVAR<short>???????????? MSHORT; typedef MVAR<unsigned short>??? MUSHORT; typedef MVAR<int>?????????????? MINT; typedef MVAR<unsigned int>??????? MUINT; typedef MVAR<long>????????????? MLONG; typedef MVAR<unsigned long>?????? MULONG; typedef MVAR<float>???????????? MFLOAT; typedef MVAR<double>??????????? MDOUBLE; typedef MVAR<BOOL>????????????? MBOOL; typedef MVAR<LPVOID>??????????? MLPVOID; typedef MVAR<BYTE>????????????? 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_bThreadContinue=TRUE; m_nThreadCount=0; int i; //開啟100個線程 for(i=0;i<100;i++) { m_nThreadCount++;??????????????? //一定要在開啟線程前累加線程計數器 AfxBeginThread(MyThread,this);??? //開啟線程,以本對象指針為參數 } } CMyClass::~CMyClass() { m_bThreadContinue=FALSE;? //通知線程關閉 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?&p=mm_13866629_0_0&n=23&l=http%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

總結

以上是生活随笔為你收集整理的多年以后重发:多线程安全的变量模板的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91视频xxx| 日本体内she精高潮 男女视频在线免费观看 | 少妇综合 | 91亚洲欧美 | 在线h网站 | 超碰97免费在线 | www.午夜| 国产视频二区 | 午夜久久网 | 波多一区 | 午夜天堂在线 | 色婷婷影院| 天天干天天操天天拍 | 人人妻人人爽人人澡人人精品 | 亚洲a网站 | 97看片吧 | 精品国产精品 | 欧洲亚洲自拍 | 欧美鲁鲁 | 自拍偷拍五月天 | 美女18网站| 最新在线视频 | 亚洲一级成人 | 女人18毛片毛片毛片毛片区二 | 精品欧美一区二区精品久久 | 国产精品16p | 日韩精美视频 | 精品一区二区毛片 | 日本xxxwww | 男女作爱免费网站 | 在线不卡二区 | 国内精品卡一卡二卡三 | 欧美亚日韩 | 色哟哟免费观看 | 亚洲网站免费观看 | 五月婷婷在线播放 | 日批视频 | 欧美精选一区二区 | 午夜成人免费电影 | 张柏芝亚洲一区二区三区 | 成人性生交大片免费看vrv66 | 亚洲一个色 | 国产亚洲无 | 午夜福利视频 | 亚洲经典在线 | 精品欧美乱码久久久久久1区2区 | 毛片你懂的 | 清冷学长被爆c躁到高潮失禁 | 视频在线观看99 | 国产顶级毛片 | 一区二区免费在线 | 国产高清欧美 | 午夜资源 | 丁香婷婷久久 | 超碰2021| 在线免费观看视频a | 欧美wwwwww | www国产黄色| 宅男噜噜噜66一区二区 | 999久久久精品视频 亚洲视频精品在线 | 成人免费在线视频 | 六月丁香激情综合 | 野外做受又硬又粗又大视频√ | 亚洲视频1 | 天天干天天操天天爱 | 日韩精品成人在线 | 三年电影在线观看 | 91精品婷婷国产综合久久蝌蚪 | 国产精品久久婷婷六月丁香 | 久久久五月天 | 国产在线观看中文字幕 | 日本高潮视频 | 色婷婷狠狠18禁久久 | 午夜激情小视频 | 国产寡妇亲子伦一区二区三区四区 | 亚洲小说春色综合另类 | 中文字幕欧美在线 | 美女极度色诱图片www视频 | 靠逼动漫 | 欧美一级精品 | 波多野结衣免费在线视频 | 亚洲成色| 国产男人的天堂 | 国产一区二区视频网站 | 肌肉猛男裸体gay网站免费 | 亚洲爱爱视频 | 青草草在线 | 驯服少爷漫画免费观看下拉式漫画 | 国产成人精品一区 | 国产人成无码视频在线观看 | 尤物videos另类xxxx | 亚洲xxxxxx| 亚洲电影在线观看 | 日韩av一区二区在线观看 | 激情自拍偷拍 | 麻豆成人久久精品一区二区三区 | 五月天激情在线 | 国产精品人人做人人爽人人添 | 日本大尺度床戏揉捏胸 |