锘??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美激情第六页,亚洲欧美在线看,亚洲国产一区二区三区a毛片 http://m.shnenglu.com/tdweng/category/15115.htmlzh-cn Fri, 17 Dec 2010 05:28:29 GMT Fri, 17 Dec 2010 05:28:29 GMT 60 InterLockedIncrement and InterLockedDecrement http://m.shnenglu.com/tdweng/articles/136461.html蹇冪窘 蹇冪窘 Wed, 15 Dec 2010 01:55:00 GMT http://m.shnenglu.com/tdweng/articles/136461.html http://m.shnenglu.com/tdweng/comments/136461.html http://m.shnenglu.com/tdweng/articles/136461.html#Feedback 0 http://m.shnenglu.com/tdweng/comments/commentRss/136461.html http://m.shnenglu.com/tdweng/services/trackbacks/136461.html 瀹炵幇鏁扮殑鍘熷瓙鎬у姞鍑忋備粈涔堟槸鍘熷瓙鎬х殑鍔犲噺鍛紵
InterLockedIncrement 涓句釜渚嬪瓙錛氬鏋滀竴涓彉閲?Long value =0;
棣栧厛璇翠竴涓嬫甯告儏鍐典笅鐨勫姞鍑忔搷浣滐細value+=1錛?/p>
1錛氱郴緇熶粠Value鐨勭┖闂村彇鍑哄鹼紝騫跺姩鎬佺敓鎴愪竴涓┖闂存潵瀛樺偍鍙栧嚭鏉ョ殑鍊鹼紱
2錛氬皢鍙栧嚭鏉ョ殑鍊煎拰1浣滃姞娉曪紝騫朵笖灝嗗拰鏀懼洖Value鐨勭┖闂磋鐩栨帀鍘熷箋傚姞娉曠粨鏉熴?/p>
濡傛灉姝ゆ椂鏈変袱涓猅hread 錛屽垎鍒浣渢hreadA錛宼hreadB銆?/p>
1錛歵hreadA灝哣alue浠庡瓨鍌ㄧ┖闂村彇鍑猴紝涓?錛?/p>
2錛歵hreadB灝哣alue浠庡瓨鍌ㄧ┖闂村彇鍑猴紝涓?錛?/p>
3錛歵hreadA灝嗗彇鍑烘潵鐨勫煎拰1浣滃姞娉曪紝騫朵笖灝嗗拰鏀懼洖Value鐨勭┖闂磋鐩栨帀鍘熷箋傚姞娉曠粨鏉燂紝Value=1銆?/p>
4錛歵hreadB灝嗗彇鍑烘潵鐨勫煎拰1浣滃姞娉曪紝騫朵笖灝嗗拰鏀懼洖Value鐨勭┖闂磋鐩栨帀鍘熷箋傚姞娉曠粨鏉燂紝Value=1銆?/p>
鏈鍚嶸alue =1 錛岃屾紜簲璇ユ槸2錛涜繖灝辨槸闂鐨勬墍鍦紝InterLockedIncrement 鑳藉淇濊瘉鍦ㄤ竴涓嚎紼嬭闂彉閲忔椂鍏跺畠綰跨▼涓嶈兘璁塊棶銆?br>渚嬶細濡傛灉 static long addref=0; 鍒?InterlockedIncrement(&addref); 鍚?addref=1 InterLockedDecrement
LONG InterlockedDecrement( LPLONG lpAddend // variable address ); 灞炰簬浜掗攣鍑芥暟錛岀敤鍦ㄥ悓涓榪涚▼鍐咃紝闇瑕佸鍏變韓鐨勪竴涓彉閲忥紝鍋氬噺娉曠殑鏃跺欙紝 闃叉鍏朵粬綰跨▼璁塊棶榪欎釜鍙橀噺錛屾槸瀹炵幇綰跨▼鍚屾鐨勪竴縐嶅姙娉曪紙浜掗攣鍑芥暟錛? 棣栧厛瑕佺悊瑙e綰跨▼鍚屾錛屽叡浜祫婧愶紙鍚屾椂璁塊棶鍏ㄥ眬鍙橀噺鐨勯棶棰橈級錛屽惁鍒欏氨闅句互鐞嗚В銆?nbsp; result = InterlockedDecrement錛?amp;SomeInt錛?nbsp; 濡傛灉涓嶈冭檻澶氱嚎紼嬪叾瀹炲氨鏄?nbsp; result = SomeInt - 1; 浣嗘槸鑰冭檻鍒板綰跨▼闂灝卞鏉備簡涓浜涖傚氨鏄濡傛灉鎯寵寰楀埌鎴戦鏈熺殑緇撴灉騫朵笉瀹規槗銆?nbsp; result = SomeInt - 1錛?nbsp; 涓句緥璇? SomeInt濡傛灉==1; 棰勬湡鐨勭粨鏋渞esult褰撶劧==0; 浣嗘槸,濡傛灉SomeInt鏄竴涓叏紼嬪叡浜殑鍏ㄥ眬鍙橀噺鎯呭喌灝變笉涓鏍蜂簡銆?nbsp; C璇█鐨?result = SomeInt - 1錛? 鍦ㄥ疄闄呯殑鎵ц榪囩▼涓紝鏈夊ソ鍑犳潯鎸囦護錛屽湪鎸囦護鎵ц榪囩▼涓紝鍏跺畠綰跨▼鍙兘鏀瑰彉SomeInt鍊鹼紝浣跨湡姝g殑緇撴灉涓庝綘棰勬湡鐨勪笉涓鑷淬?nbsp; 鎵浠nterlockedDecrement(&SomeInt)鐨勬墽琛岃繃紼嬫槸榪欐牱鐨?nbsp; { __紱佹鍏朵粬綰跨▼璁塊棶 (&SomeInt) 榪欎釜鍦板潃 SomeInt --; move EAX, someInt; // 璁懼畾榪斿洖鍊?C++鍑芥暟鐨勮繑鍥炲?nbsp; 閮芥斁鍦‥AX涓? __寮鏀懼叾浠栫嚎紼嬭闂?nbsp; (&SomeInt) 榪欎釜鍦板潃 } 浣嗘槸瀹為檯涓婂彧闇瑕佸嚑鏉℃寚浠ゅ姞鍓嶇紑灝卞彲浠ュ畬鎴愶紝浠ヤ笂璇存槑鏄斁澶х殑銆?nbsp; 浣犱篃璁鎬細璇達紝榪欐湁蹇呰鍚? 涓鑸潵璇達紝鍙戠敓閿欒鐨勬鐜囦笉澶э紝浣嗘槸闃茶寖鎬繪槸蹇呰鐨?
渚嬶細濡傛灉 static long addref=0; 鍒?InterlockedDecrement(&addref); 鍚?addref=-1
]]>銆愯漿銆戜竴涓畝鍗曠殑綰跨▼姹狅紙c++鐗堬級 http://m.shnenglu.com/tdweng/articles/129161.html蹇冪窘 蹇冪窘 Sat, 09 Oct 2010 01:42:00 GMT http://m.shnenglu.com/tdweng/articles/129161.html http://m.shnenglu.com/tdweng/comments/129161.html http://m.shnenglu.com/tdweng/articles/129161.html#Feedback 0 http://m.shnenglu.com/tdweng/comments/commentRss/129161.html http://m.shnenglu.com/tdweng/services/trackbacks/129161.html #ifndef _ThreadPool_H_ #define _ThreadPool_H_ #pragma warning(disable: 4530) #pragma warning(disable: 4786) #include <cassert> #include <vector> #include <queue> #include <windows.h> class ThreadJob //宸ヤ綔鍩虹被 { public: //渚涚嚎紼嬫睜璋冪敤鐨勮櫄鍑芥暟 virtual void DoJob(void *pPara) = 0; }; class ThreadPool { public: //dwNum 綰跨▼姹犺妯?br> ThreadPool(DWORD dwNum = 4) : _lThreadNum(0), _lRunningNum(0) { InitializeCriticalSection(&_csThreadVector); InitializeCriticalSection(&_csWorkQueue); _EventComplete = CreateEvent(0, false, false, NULL); _EventEnd = CreateEvent(0, true, false, NULL); _SemaphoreCall = CreateSemaphore(0, 0, 0x7FFFFFFF, NULL); _SemaphoreDel = CreateSemaphore(0, 0, 0x7FFFFFFF, NULL); assert(_SemaphoreCall != INVALID_HANDLE_VALUE); assert(_EventComplete != INVALID_HANDLE_VALUE); assert(_EventEnd != INVALID_HANDLE_VALUE); assert(_SemaphoreDel != INVALID_HANDLE_VALUE); AdjustSize(dwNum <= 0 ? 4 : dwNum); } ~ThreadPool() { DeleteCriticalSection(&_csWorkQueue); CloseHandle(_EventEnd); CloseHandle(_EventComplete); CloseHandle(_SemaphoreCall); CloseHandle(_SemaphoreDel); vector<ThreadItem*>::iterator iter; for(iter = _ThreadVector.begin(); iter != _ThreadVector.end(); iter++) { if(*iter) delete *iter; } DeleteCriticalSection(&_csThreadVector); } //璋冩暣綰跨▼姹犺妯?br> int AdjustSize(int iNum) { if(iNum > 0) { ThreadItem *pNew; EnterCriticalSection(&_csThreadVector); for(int _i=0; _i<iNum; _i++) { _ThreadVector.push_back(pNew = new ThreadItem(this)); assert(pNew); pNew->_Handle = CreateThread(NULL, 0, DefaultJobProc, pNew, 0, NULL); assert(pNew->_Handle); } LeaveCriticalSection(&_csThreadVector); } else { iNum *= -1; ReleaseSemaphore(_SemaphoreDel, iNum > _lThreadNum ? _lThreadNum : iNum, NULL); } return (int)_lThreadNum; } //璋冪敤綰跨▼姹?br> void Call(void (*pFunc)(void *), void *pPara = NULL) { assert(pFunc); EnterCriticalSection(&_csWorkQueue); _JobQueue.push(new JobItem(pFunc, pPara)); LeaveCriticalSection(&_csWorkQueue); ReleaseSemaphore(_SemaphoreCall, 1, NULL); } //璋冪敤綰跨▼姹?br> inline void Call(ThreadJob * p, void *pPara = NULL) { Call(CallProc, new CallProcPara(p, pPara)); } //緇撴潫綰跨▼姹? 騫跺悓姝ョ瓑寰?br> bool EndAndWait(DWORD dwWaitTime = INFINITE) { SetEvent(_EventEnd); return WaitForSingleObject(_EventComplete, dwWaitTime) == WAIT_OBJECT_0; } //緇撴潫綰跨▼姹?br> inline void End() { SetEvent(_EventEnd); } inline DWORD Size() { return (DWORD)_lThreadNum; } inline DWORD GetRunningSize() { return (DWORD)_lRunningNum; } bool IsRunning() { return _lRunningNum > 0; } protected: //宸ヤ綔綰跨▼ static DWORD WINAPI DefaultJobProc(LPVOID lpParameter = NULL) { ThreadItem *pThread = static_cast<ThreadItem*>(lpParameter); assert(pThread); ThreadPool *pThreadPoolObj = pThread->_pThis; assert(pThreadPoolObj); InterlockedIncrement(&pThreadPoolObj->_lThreadNum); HANDLE hWaitHandle[3]; hWaitHandle[0] = pThreadPoolObj->_SemaphoreCall; hWaitHandle[1] = pThreadPoolObj->_SemaphoreDel; hWaitHandle[2] = pThreadPoolObj->_EventEnd; JobItem *pJob; bool fHasJob; for(;;) { DWORD wr = WaitForMultipleObjects(3, hWaitHandle, false, INFINITE); //鍝嶅簲鍒犻櫎綰跨▼淇″彿 if(wr == WAIT_OBJECT_0 + 1) break; //浠庨槦鍒楅噷鍙栧緱鐢ㄦ埛浣滀笟 EnterCriticalSection(&pThreadPoolObj->_csWorkQueue); if(fHasJob = !pThreadPoolObj->_JobQueue.empty()) { pJob = pThreadPoolObj->_JobQueue.front(); pThreadPoolObj->_JobQueue.pop(); assert(pJob); } LeaveCriticalSection(&pThreadPoolObj->_csWorkQueue); //鍙楀埌緇撴潫綰跨▼淇″彿紜畾鏄惁緇撴潫綰跨▼(緇撴潫綰跨▼淇″彿&& 鏄惁榪樻湁宸ヤ綔) if(wr == WAIT_OBJECT_0 + 2 && !fHasJob) break; if(fHasJob && pJob) { InterlockedIncrement(&pThreadPoolObj->_lRunningNum); pThread->_dwLastBeginTime = GetTickCount(); pThread->_dwCount++; pThread->_fIsRunning = true; pJob->_pFunc(pJob->_pPara); //榪愯鐢ㄦ埛浣滀笟 delete pJob; pThread->_fIsRunning = false; InterlockedDecrement(&pThreadPoolObj->_lRunningNum); } } //鍒犻櫎鑷韓緇撴瀯 EnterCriticalSection(&pThreadPoolObj->_csThreadVector); pThreadPoolObj->_ThreadVector.erase(find(pThreadPoolObj->_ThreadVector.begin(), pThreadPoolObj->_ThreadVector.end(), pThread)); LeaveCriticalSection(&pThreadPoolObj->_csThreadVector); delete pThread; InterlockedDecrement(&pThreadPoolObj->_lThreadNum); if(!pThreadPoolObj->_lThreadNum) //鎵鏈夌嚎紼嬬粨鏉?br> SetEvent(pThreadPoolObj->_EventComplete); return 0; } //璋冪敤鐢ㄦ埛瀵硅薄铏氬嚱鏁?br> static void CallProc(void *pPara) { CallProcPara *cp = static_cast<CallProcPara *>(pPara); assert(cp); if(cp) { cp->_pObj->DoJob(cp->_pPara); delete cp; } } //鐢ㄦ埛瀵硅薄緇撴瀯 struct CallProcPara { ThreadJob* _pObj;//鐢ㄦ埛瀵硅薄 void *_pPara;//鐢ㄦ埛鍙傛暟 CallProcPara(ThreadJob* p, void *pPara) : _pObj(p), _pPara(pPara) { }; }; //鐢ㄦ埛鍑芥暟緇撴瀯 struct JobItem { void (*_pFunc)(void *);//鍑芥暟 void *_pPara; //鍙傛暟 JobItem(void (*pFunc)(void *) = NULL, void *pPara = NULL) : _pFunc(pFunc), _pPara(pPara) { }; }; //綰跨▼姹犱腑鐨勭嚎紼嬬粨鏋?br> struct ThreadItem { HANDLE _Handle; //綰跨▼鍙ユ焺 ThreadPool *_pThis; //綰跨▼姹犵殑鎸囬拡 DWORD _dwLastBeginTime; //鏈鍚庝竴嬈¤繍琛屽紑濮嬫椂闂?br> DWORD _dwCount; //榪愯嬈℃暟 bool _fIsRunning; ThreadItem(ThreadPool *pthis) : _pThis(pthis), _Handle(NULL), _dwLastBeginTime(0), _dwCount(0), _fIsRunning(false) { }; ~ThreadItem() { if(_Handle) { CloseHandle(_Handle); _Handle = NULL; } } }; std::queue<JobItem *> _JobQueue; //宸ヤ綔闃熷垪 std::vector<ThreadItem *> _ThreadVector; //綰跨▼鏁版嵁 CRITICAL_SECTION _csThreadVector, _csWorkQueue; //宸ヤ綔闃熷垪涓寸晫, 綰跨▼鏁版嵁涓寸晫 HANDLE _EventEnd, _EventComplete, _SemaphoreCall, _SemaphoreDel;//緇撴潫閫氱煡, 瀹屾垚浜嬩歡, 宸ヤ綔淇″彿錛屽垹闄ょ嚎紼嬩俊鍙?br> long _lThreadNum, _lRunningNum; //綰跨▼鏁? 榪愯鐨勭嚎紼嬫暟 }; #endif //_ThreadPool_H_
浣跨敤璇存槑1錛?/p>
璋冪敤鏂規硶
void threadfunc(void *p)
{
YourClass* yourObject = (YourClass*) p;
//
}
ThreadPool tp;
for(i=0; i<100; i++)
tp.Call(threadfunc);
ThreadPool tp(20);//20涓哄垵濮嬬嚎紼嬫睜瑙勬ā
tp.Call(threadfunc, lpPara);
浣跨敤鏃舵敞鎰忓嚑鐐癸細
1. ThreadJob 娌′粈涔堢敤錛岀洿鎺ュ啓綰跨▼鍑芥暟鍚с?nbsp;
2. 綰跨▼鍑芥暟錛坱hreadfunc錛夌殑鍏ュ彛鍙傛暟void* 鍙互杞垚鑷畾涔夌殑綾誨瀷瀵硅薄錛岃繖涓璞″彲浠ヨ褰曚笅綰跨▼榪愯涓殑鏁版嵁錛屽茍璁劇疆綰跨▼褰撳墠鐘舵侊紝浠ユ涓庣嚎紼嬭繘琛屼氦浜掋?/p>
3. 綰跨▼姹犳湁涓涓狤ndAndWait鍑芥暟錛岀敤浜庤綰跨▼姹犱腑鎵鏈夎綆楁甯哥粨鏉熴傛湁鏃剁嚎紼嬫睜涓殑涓涓嚎紼嬪彲鑳借榪愯寰堥暱鏃墮棿錛屾庝箞鍔烇紵鍙互閫氳繃綰跨▼鍑芥暟threadfunc鐨勫叆鍙e弬鏁板璞℃潵澶勭悊錛屾瘮濡傦細
class YourClass { int cmd; // cmd = 1鏄笂綰跨▼鍋滄璁$畻錛屾甯擱鍑恒?br>}; threadfunc(void* p) { YourClass* yourObject = (YourClass*)p; while (true) { // do some calculation if (yourClass->cmd == 1) break; } }
鍦ㄤ富綰跨▼涓緗畒ourClass->cmd = 1錛岃綰跨▼灝變細鑷劧緇撴潫銆?/p>
浣跨敤璇存槑2錛?/p>
Code
void threadfunc(void *p)
{
//
}
ThreadPool tp;
for(i=0; i<100; i++)
tp.Call(threadfunc);
ThreadPool tp(20);//20涓哄垵濮嬬嚎紼嬫睜瑙勬ā
tp.Call(threadfunc, lpPara);
tp.AdjustSize(50);//澧炲姞50
tp.AdjustSize(-30);//鍑忓皯30
class MyThreadJob : public ThreadJob //綰跨▼瀵硅薄浠嶵hreadJob鎵╁睍
{
public:
virtual void DoJob(void *p)//鑷畾涔夌殑铏氬嚱鏁?br> {
//
.
}
};
MyThreadJob mt[10];
ThreadPool tp;
for(i=0; i<100 i++)
tp.Call(mt + i);//tp.Call(mt + i, para);
]]> Visual C++綰跨▼鍚屾鎶鏈?杞? http://m.shnenglu.com/tdweng/articles/124796.html蹇冪窘 蹇冪窘 Thu, 26 Aug 2010 03:38:00 GMT http://m.shnenglu.com/tdweng/articles/124796.html http://m.shnenglu.com/tdweng/comments/124796.html http://m.shnenglu.com/tdweng/articles/124796.html#Feedback 0 http://m.shnenglu.com/tdweng/comments/commentRss/124796.html http://m.shnenglu.com/tdweng/services/trackbacks/124796.html 綰跨▼鍚屾鐨勬柟寮忔湁錛?br>銆銆涓寸晫鍖?br>銆銆綆$悊浜嬩歡鍐呮牳瀵硅薄 銆銆淇″彿閲忓唴鏍稿璞?br>銆銆浜掓枼鍐呮牳瀵硅薄 鍒嗗埆浠嬬粛濡備笅錛?br> 浣跨嚎紼嬪悓姝?br> 銆銆鍦ㄧ▼搴忎腑浣跨敤澶氱嚎紼嬫椂錛屼竴鑸緢灝戞湁澶氫釜綰跨▼鑳藉湪鍏剁敓鍛芥湡鍐呰繘琛屽畬鍏ㄧ嫭绔嬬殑鎿嶄綔銆傛洿澶氱殑鎯呭喌鏄竴浜涚嚎紼嬭繘琛屾煇浜涘鐞嗘搷浣滐紝鑰屽叾浠栫殑綰跨▼蹇呴』瀵瑰叾澶勭悊緇撴灉榪涜浜嗚В銆傛甯告儏鍐典笅瀵硅繖縐嶅鐞嗙粨鏋滅殑浜嗚В搴斿綋鍦ㄥ叾澶勭悊浠誨姟瀹屾垚鍚庤繘琛屻?br> 銆銆濡傛灉涓嶉噰鍙栭傚綋鐨勬帾鏂斤紝鍏朵粬綰跨▼寰寰浼氬湪綰跨▼澶勭悊浠誨姟緇撴潫鍓嶅氨鍘昏闂鐞嗙粨鏋滐紝榪欏氨寰堟湁鍙兘寰楀埌鏈夊叧澶勭悊緇撴灉鐨勯敊璇簡瑙c備緥濡傦紝澶氫釜綰跨▼鍚屾椂璁塊棶鍚屼竴涓叏灞鍙橀噺錛屽鏋滈兘鏄鍙栨搷浣滐紝鍒欎笉浼氬嚭鐜伴棶棰樸傚鏋滀竴涓嚎紼嬭礋璐f敼鍙樻鍙橀噺鐨勫鹼紝鑰屽叾浠栫嚎紼嬭礋璐e悓鏃惰鍙栧彉閲忓唴瀹癸紝鍒欎笉鑳戒繚璇佽鍙栧埌鐨勬暟鎹槸緇忚繃鍐欑嚎紼嬩慨鏀瑰悗鐨勩?br> 銆銆涓轟簡紜繚璇葷嚎紼嬭鍙栧埌鐨勬槸緇忚繃淇敼鐨勫彉閲忥紝灝卞繀欏誨湪鍚戝彉閲忓啓鍏ユ暟鎹椂紱佹鍏朵粬綰跨▼瀵瑰叾鐨勪換浣曡闂紝鐩磋嚦璧嬪艱繃紼嬬粨鏉熷悗鍐嶈В闄ゅ鍏朵粬綰跨▼鐨勮闂檺鍒躲傝薄榪欑淇濊瘉綰跨▼鑳戒簡瑙e叾浠栫嚎紼嬩換鍔″鐞嗙粨鏉熷悗鐨勫鐞嗙粨鏋滆岄噰鍙栫殑淇濇姢鎺柦鍗充負綰跨▼鍚屾銆?br> 銆銆綰跨▼鍚屾鏄竴涓潪甯稿ぇ鐨勮瘽棰橈紝鍖呮嫭鏂規柟闈㈤潰鐨勫唴瀹廣備粠澶х殑鏂歸潰璁詫紝綰跨▼鐨勫悓姝ュ彲鍒嗙敤鎴鋒ā寮忕殑綰跨▼鍚屾鍜屽唴鏍稿璞$殑綰跨▼鍚屾涓ゅぇ綾匯傜敤鎴鋒ā寮忎腑綰跨▼鐨勫悓姝ユ柟娉曚富瑕佹湁鍘熷瓙璁塊棶鍜屼復鐣屽尯絳夋柟娉曘傚叾鐗圭偣鏄悓姝ラ熷害鐗瑰埆蹇紝閫傚悎浜庡綰跨▼榪愯閫熷害鏈変弗鏍艱姹傜殑鍦哄悎銆?br> 銆銆鍐呮牳瀵硅薄鐨勭嚎紼嬪悓姝ュ垯涓昏鐢變簨浠躲佺瓑寰呭畾鏃跺櫒銆佷俊鍙烽噺浠ュ強淇″彿鐏瓑鍐呮牳瀵硅薄鏋勬垚銆傜敱浜庤繖縐嶅悓姝ユ満鍒朵嬌鐢ㄤ簡鍐呮牳瀵硅薄錛屼嬌鐢ㄦ椂蹇呴』灝嗙嚎紼嬩粠鐢ㄦ埛妯″紡鍒囨崲鍒板唴鏍告ā寮忥紝鑰岃繖縐嶈漿鎹竴鑸鑰楄垂榪戝崈涓狢PU鍛ㄦ湡錛屽洜姝ゅ悓姝ラ熷害杈冩參錛屼絾鍦ㄩ傜敤鎬т笂鍗磋榪滀紭浜庣敤鎴鋒ā寮忕殑綰跨▼鍚屾鏂瑰紡銆?br>涓寸晫鍖?/strong> 銆銆涓寸晫鍖猴紙Critical Section錛夋槸涓孌電嫭鍗犲鏌愪簺鍏變韓璧勬簮璁塊棶鐨勪唬鐮侊紝鍦ㄤ換鎰忔椂鍒誨彧鍏佽涓涓嚎紼嬪鍏變韓璧勬簮榪涜璁塊棶銆傚鏋滄湁澶氫釜綰跨▼璇曞浘鍚屾椂璁塊棶涓寸晫鍖猴紝閭d箞鍦ㄦ湁涓涓嚎紼嬭繘鍏ュ悗鍏朵粬鎵鏈夎瘯鍥捐闂涓寸晫鍖虹殑綰跨▼灝嗚鎸傝搗錛屽茍涓鐩存寔緇埌榪涘叆涓寸晫鍖虹殑綰跨▼紱誨紑銆備復鐣屽尯鍦ㄨ閲婃斁鍚庯紝鍏朵粬綰跨▼鍙互緇х畫鎶㈠崰錛屽茍浠ユ杈懼埌鐢ㄥ師瀛愭柟寮忔搷浣滃叡浜祫婧愮殑鐩殑銆?br> 銆銆涓寸晫鍖哄湪浣跨敤鏃朵互CRITICAL_SECTION緇撴瀯瀵硅薄淇濇姢鍏變韓璧勬簮錛屽茍鍒嗗埆鐢‥nterCriticalSection錛堬級鍜孡eaveCriticalSection錛堬級鍑芥暟鍘繪爣璇嗗拰閲婃斁涓涓復鐣屽尯銆傛墍鐢ㄥ埌鐨凜RITICAL_SECTION緇撴瀯瀵硅薄蹇呴』緇忚繃InitializeCriticalSection錛堬級鐨勫垵濮嬪寲鍚庢墠鑳戒嬌鐢紝鑰屼笖蹇呴』紜繚鎵鏈夌嚎紼嬩腑鐨勪換浣曡瘯鍥捐闂鍏變韓璧勬簮鐨勪唬鐮侀兘澶勫湪姝や復鐣屽尯鐨勪繚鎶や箣涓嬨傚惁鍒欎復鐣屽尯灝嗕笉浼氳搗鍒板簲鏈夌殑浣滅敤錛屽叡浜祫婧愪緷鐒舵湁琚牬鍧忕殑鍙兘銆?br> 鍥? 浣跨敤涓寸晫鍖轟繚鎸佺嚎紼嬪悓姝?br> 銆銆涓嬮潰閫氳繃涓孌典唬鐮佸睍紺轟簡涓寸晫鍖哄湪淇濇姢澶氱嚎紼嬭闂殑鍏變韓璧勬簮涓殑浣滅敤銆傞氳繃涓や釜綰跨▼鏉ュ垎鍒鍏ㄥ眬鍙橀噺g_cArray[10]榪涜鍐欏叆鎿嶄綔錛岀敤涓寸晫鍖虹粨鏋勫璞_cs鏉ヤ繚鎸佺嚎紼嬬殑鍚屾錛屽茍鍦ㄥ紑鍚嚎紼嬪墠瀵瑰叾榪涜鍒濆鍖栥備負浜嗕嬌瀹為獙鏁堟灉鏇村姞鏄庢樉錛屼綋鐜板嚭涓寸晫鍖虹殑浣滅敤錛屽湪綰跨▼鍑芥暟瀵瑰叡浜祫婧恎_cArray[10]鐨勫啓鍏ユ椂錛屼互Sleep錛堬級鍑芥暟寤惰繜1姣錛屼嬌鍏朵粬綰跨▼鍚屽叾鎶㈠崰CPU鐨勫彲鑳芥у澶с傚鏋滀笉浣跨敤涓寸晫鍖哄鍏惰繘琛屼繚鎶わ紝鍒欏叡浜祫婧愭暟鎹皢琚牬鍧忥紙鍙傝鍥?錛坅錛夋墍紺鴻綆楃粨鏋滐級錛岃屼嬌鐢ㄤ復鐣屽尯瀵圭嚎紼嬩繚鎸佸悓姝ュ悗鍒欏彲浠ュ緱鍒版紜殑緇撴灉錛堝弬瑙佸浘1錛坆錛夋墍紺鴻綆楃粨鏋滐級銆備唬鐮佸疄鐜版竻鍗曢檮涓嬶細
// 涓寸晫鍖虹粨鏋勫璞?br>CRITICAL_SECTION g_cs; // 鍏變韓璧勬簮 char g_cArray[10]; UINT ThreadProc10(LPVOID pParam) { 銆// 榪涘叆涓寸晫鍖?br>銆EnterCriticalSection(&g_cs); 銆// 瀵瑰叡浜祫婧愯繘琛屽啓鍏ユ搷浣?br>銆for (int i = 0; i < 10; i++) 銆{ 銆銆g_cArray[i] = 'a'; 銆銆Sleep(1); 銆} 銆// 紱誨紑涓寸晫鍖?br>銆LeaveCriticalSection(&g_cs); 銆return 0; } UINT ThreadProc11(LPVOID pParam) { 銆// 榪涘叆涓寸晫鍖?br>銆EnterCriticalSection(&g_cs); 銆// 瀵瑰叡浜祫婧愯繘琛屽啓鍏ユ搷浣?br>銆for (int i = 0; i < 10; i++) 銆{ 銆銆g_cArray[10 - i - 1] = 'b'; 銆銆Sleep(1); 銆} 銆// 紱誨紑涓寸晫鍖?br>銆LeaveCriticalSection(&g_cs); 銆return 0; } …… void CSample08View::OnCriticalSection() { 銆// 鍒濆鍖栦復鐣屽尯 銆InitializeCriticalSection(&g_cs); 銆// 鍚姩綰跨▼ 銆AfxBeginThread(ThreadProc10, NULL); 銆AfxBeginThread(ThreadProc11, NULL); 銆// 絳夊緟璁$畻瀹屾瘯 銆Sleep(300); 銆// 鎶ュ憡璁$畻緇撴灉 銆CString sResult = CString(g_cArray); 銆AfxMessageBox(sResult); }
銆銆鍦ㄤ嬌鐢ㄤ復鐣屽尯鏃訛紝涓鑸笉鍏佽鍏惰繍琛屾椂闂磋繃闀匡紝鍙榪涘叆涓寸晫鍖虹殑綰跨▼榪樻病鏈夌寮錛屽叾浠栨墍鏈夎瘯鍥捐繘鍏ユ涓寸晫鍖虹殑綰跨▼閮戒細琚寕璧瘋岃繘鍏ュ埌絳夊緟鐘舵侊紝騫朵細鍦ㄤ竴瀹氱▼搴︿笂褰卞搷銆傜▼搴忕殑榪愯鎬ц兘銆傚挨鍏墮渶瑕佹敞鎰忕殑鏄笉瑕佸皢絳夊緟鐢ㄦ埛杈撳叆鎴栨槸鍏朵粬涓浜涘鐣屽共棰勭殑鎿嶄綔鍖呭惈鍒頒復鐣屽尯銆傚鏋滆繘鍏ヤ簡涓寸晫鍖哄嵈涓鐩存病鏈夐噴鏀撅紝鍚屾牱涔熶細寮曡搗鍏朵粬綰跨▼鐨勯暱鏃墮棿絳夊緟銆傛崲鍙ヨ瘽璇達紝鍦ㄦ墽琛屼簡EnterCriticalSection錛堬級璇彞榪涘叆涓寸晫鍖哄悗鏃犺鍙戠敓浠涔堬紝蹇呴』紜繚涓庝箣鍖歸厤鐨凩eaveCriticalSection錛堬級閮借兘澶熻鎵ц鍒般傚彲浠ラ氳繃娣誨姞緇撴瀯鍖栧紓甯稿鐞嗕唬鐮佹潵紜繚LeaveCriticalSection錛堬級璇彞鐨勬墽琛屻傝櫧鐒朵復鐣屽尯鍚屾閫熷害寰堝揩錛屼絾鍗村彧鑳界敤鏉ュ悓姝ユ湰榪涚▼鍐呯殑綰跨▼錛岃屼笉鍙敤鏉ュ悓姝ュ涓繘紼嬩腑鐨勭嚎紼嬨?br> 銆銆MFC涓轟復鐣屽尯鎻愪緵鏈変竴涓狢CriticalSection綾伙紝浣跨敤璇ョ被榪涜綰跨▼鍚屾澶勭悊鏄潪甯哥畝鍗曠殑錛屽彧闇鍦ㄧ嚎紼嬪嚱鏁頒腑鐢–CriticalSection綾繪垚鍛樺嚱鏁癓ock錛堬級鍜孶nLock錛堬級鏍囧畾鍑鴻淇濇姢浠g爜鐗囨鍗沖彲銆傚浜庝笂榪頒唬鐮侊紝鍙氳繃CCriticalSection綾誨皢鍏舵敼鍐欏涓嬶細
// MFC涓寸晫鍖虹被瀵硅薄 CCriticalSection g_clsCriticalSection; // 鍏變韓璧勬簮 char g_cArray[10]; UINT ThreadProc20(LPVOID pParam) { 銆// 榪涘叆涓寸晫鍖?br>銆g_clsCriticalSection.Lock(); 銆// 瀵瑰叡浜祫婧愯繘琛屽啓鍏ユ搷浣?br>銆for (int i = 0; i < 10; i++) 銆{ 銆銆g_cArray[i] = 'a'; 銆銆Sleep(1); 銆} 銆// 紱誨紑涓寸晫鍖?br>銆g_clsCriticalSection.Unlock(); 銆return 0; } UINT ThreadProc21(LPVOID pParam) { 銆// 榪涘叆涓寸晫鍖?br>銆g_clsCriticalSection.Lock(); 銆// 瀵瑰叡浜祫婧愯繘琛屽啓鍏ユ搷浣?br>銆for (int i = 0; i < 10; i++) 銆{ 銆銆g_cArray[10 - i - 1] = 'b'; 銆銆Sleep(1); 銆} 銆// 紱誨紑涓寸晫鍖?br>銆g_clsCriticalSection.Unlock(); 銆return 0; } …… void CSample08View::OnCriticalSectionMfc() { 銆// 鍚姩綰跨▼ 銆AfxBeginThread(ThreadProc20, NULL); 銆AfxBeginThread(ThreadProc21, NULL); 銆// 絳夊緟璁$畻瀹屾瘯 銆Sleep(300); 銆// 鎶ュ憡璁$畻緇撴灉 銆CString sResult = CString(g_cArray); 銆AfxMessageBox(sResult); }
綆$悊浜嬩歡鍐呮牳瀵硅薄 銆銆鍦ㄥ墠闈㈣榪扮嚎紼嬮氫俊鏃舵浘浣跨敤榪囦簨浠跺唴鏍稿璞℃潵榪涜綰跨▼闂寸殑閫氫俊錛岄櫎姝や箣澶栵紝浜嬩歡鍐呮牳瀵硅薄涔熷彲浠ラ氳繃閫氱煡鎿嶄綔鐨勬柟寮忔潵淇濇寔綰跨▼鐨勫悓姝ャ傚浜庡墠闈㈤偅孌典嬌鐢ㄤ復鐣屽尯淇濇寔綰跨▼鍚屾鐨勪唬鐮佸彲鐢ㄤ簨浠跺璞$殑綰跨▼鍚屾鏂規硶鏀瑰啓濡備笅錛?br>
// 浜嬩歡鍙ユ焺 HANDLE hEvent = NULL; // 鍏變韓璧勬簮 char g_cArray[10]; …… UINT ThreadProc12(LPVOID pParam) { 銆// 絳夊緟浜嬩歡緗綅 銆WaitForSingleObject(hEvent, INFINITE);//鏈変俊鍙鋒椂鎵嶈兘榪涘叆錛岃嫢鍒涘緩浜嬩歡鍙ユ焺涓烘墜鍔ㄥ鍘燂紝涓嬩竴鍙ュ簲璁句負 銆// 瀵瑰叡浜祫婧愯繘琛屽啓鍏ユ搷浣?nbsp; //ResetEvent(hEvent),璁句負鏃犱俊鍙鳳紝鑻ヤ負鑷姩澶嶅師錛岃嚜鍔ㄨ涓烘棤淇″彿銆?br>銆for (int i = 0; i < 10; i++) 銆{ 銆銆g_cArray[i] = 'a'; 銆銆Sleep(1); 銆} 銆// 澶勭悊瀹屾垚鍚庡嵆灝嗕簨浠跺璞$疆浣?br>銆SetEvent(hEvent);//璁句負鏈変俊鍙?br>銆return 0; } UINT ThreadProc13(LPVOID pParam) { 銆// 絳夊緟浜嬩歡緗綅 銆WaitForSingleObject(hEvent, INFINITE);//鏈変俊鍙鋒椂鎵嶈兘榪涘叆錛岃嫢鍒涘緩浜嬩歡鍙ユ焺涓烘墜鍔ㄥ鍘燂紝涓嬩竴鍙ュ簲璁句負 銆// 瀵瑰叡浜祫婧愯繘琛屽啓鍏ユ搷浣?nbsp; //ResetEvent(hEvent),璁句負鏃犱俊鍙鳳紝鑻ヤ負鑷姩澶嶅師錛岃嚜鍔ㄨ涓烘棤淇″彿銆?br>銆for (int i = 0; i < 10; i++) 銆{ 銆銆g_cArray[10 - i - 1] = 'b'; 銆銆Sleep(1); 銆} 銆// 澶勭悊瀹屾垚鍚庡嵆灝嗕簨浠跺璞$疆浣?br>銆SetEvent(hEvent);//璁句負鏈変俊鍙?br>銆return 0; } …… void CSample08View::OnEvent() { 銆// 鍒涘緩浜嬩歡 銆hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);//鍒涘緩鏃惰涓鴻嚜鍔ㄥ浣嶏紝鏃犱俊鍙?br>銆// 浜嬩歡緗綅 銆SetEvent(hEvent);//璁句負鏈変俊鍙?br>銆// 鍚姩綰跨▼ 銆AfxBeginThread(ThreadProc12, NULL); 銆AfxBeginThread(ThreadProc13, NULL); 銆// 絳夊緟璁$畻瀹屾瘯 銆Sleep(300); 銆// 鎶ュ憡璁$畻緇撴灉 銆CString sResult = CString(g_cArray); 銆AfxMessageBox(sResult); }
銆銆鍦ㄥ垱寤虹嚎紼嬪墠錛岄鍏堝垱寤轟竴涓彲浠ヨ嚜鍔ㄥ浣嶇殑浜嬩歡鍐呮牳瀵硅薄hEvent錛岃岀嚎紼嬪嚱鏁板垯閫氳繃WaitForSingleObject錛堬級絳夊緟鍑芥暟鏃犻檺絳夊緟hEvent鐨勭疆浣嶏紝鍙湁鍦ㄤ簨浠剁疆浣嶆椂WaitForSingleObject錛堬級鎵嶄細榪斿洖錛岃淇濇姢鐨勪唬鐮佸皢寰椾互鎵ц銆傚浜庝互鑷姩澶嶄綅鏂瑰紡鍒涘緩鐨勪簨浠跺璞★紝鍦ㄥ叾緗綅鍚庝竴琚玏aitForSingleObject錛堬級絳夊緟鍒板氨浼氱珛鍗沖浣嶏紝涔熷氨鏄鍦ㄦ墽琛孴hreadProc12錛堬級涓殑鍙椾繚鎶や唬鐮佹椂錛屼簨浠跺璞″凡緇忔槸澶嶄綅鐘舵佺殑錛岃繖鏃跺嵆浣挎湁ThreadProc13錛堬級瀵笴PU鐨勬姠鍗狅紝涔熶細鐢變簬WaitForSingleObject錛堬級娌℃湁hEvent鐨勭疆浣嶈屼笉鑳界戶緇墽琛岋紝涔熷氨娌℃湁鍙兘鐮村潖鍙椾繚鎶ょ殑鍏變韓璧勬簮銆傚湪ThreadProc12錛堬級涓殑澶勭悊瀹屾垚鍚庡彲浠ラ氳繃SetEvent錛堬級瀵筯Event鐨勭疆浣嶈屽厑璁窽hreadProc13錛堬級瀵瑰叡浜祫婧恎_cArray鐨勫鐞嗐傝繖閲孲etEvent錛堬級鎵璧風殑浣滅敤鍙互鐪嬩綔鏄鏌愰」鐗瑰畾浠誨姟瀹屾垚鐨勯氱煡銆?br> 銆銆浣跨敤涓寸晫鍖哄彧鑳藉悓姝ュ悓涓榪涚▼涓殑綰跨▼錛岃屼嬌鐢ㄤ簨浠跺唴鏍稿璞″垯鍙互瀵硅繘紼嬪鐨勭嚎紼嬭繘琛屽悓姝ワ紝鍏跺墠鎻愭槸寰楀埌瀵規浜嬩歡瀵硅薄鐨勮闂潈銆傚彲浠ラ氳繃OpenEvent錛堬級鍑芥暟鑾峰彇寰楀埌錛屽叾鍑芥暟鍘熷瀷涓猴細
HANDLE OpenEvent( 銆DWORD dwDesiredAccess, // 璁塊棶鏍囧織 銆BOOL bInheritHandle, // 緇ф壙鏍囧織 銆LPCTSTR lpName // 鎸囧悜浜嬩歡瀵硅薄鍚嶇殑鎸囬拡 );
銆銆濡傛灉浜嬩歡瀵硅薄宸插垱寤猴紙鍦ㄥ垱寤轟簨浠舵椂闇瑕佹寚瀹氫簨浠跺悕錛夛紝鍑芥暟灝嗚繑鍥炴寚瀹氫簨浠剁殑鍙ユ焺銆傚浜庨偅浜涘湪鍒涘緩浜嬩歡鏃舵病鏈夋寚瀹氫簨浠跺悕鐨勪簨浠跺唴鏍稿璞★紝鍙互閫氳繃浣跨敤鍐呮牳瀵硅薄鐨勭戶鎵挎ф垨鏄皟鐢―uplicateHandle錛堬級鍑芥暟鏉ヨ皟鐢–reateEvent錛堬級浠ヨ幏寰楀鎸囧畾浜嬩歡瀵硅薄鐨勮闂潈銆傚湪鑾峰彇鍒拌闂潈鍚庢墍榪涜鐨勫悓姝ユ搷浣滀笌鍦ㄥ悓涓涓繘紼嬩腑鎵榪涜鐨勭嚎紼嬪悓姝ユ搷浣滄槸涓鏍風殑銆?br> 銆銆濡傛灉闇瑕佸湪涓涓嚎紼嬩腑絳夊緟澶氫釜浜嬩歡錛屽垯鐢╓aitForMultipleObjects錛堬級鏉ョ瓑寰呫俉aitForMultipleObjects錛堬級涓嶹aitForSingleObject錛堬級綾諱技錛屽悓鏃剁洃瑙嗕綅浜庡彞鏌勬暟緇勪腑鐨勬墍鏈夊彞鏌勩傝繖浜涜鐩戣瀵硅薄鐨勫彞鏌勪韓鏈夊鉤絳夌殑浼樺厛鏉冿紝浠諱綍涓涓彞鏌勯兘涓嶅彲鑳芥瘮鍏朵粬鍙ユ焺鍏鋒湁鏇撮珮鐨勪紭鍏堟潈銆俉aitForMultipleObjects錛堬級鐨勫嚱鏁板師鍨嬩負錛?br>
DWORD WaitForMultipleObjects( 銆DWORD nCount, // 絳夊緟鍙ユ焺鏁?br>銆CONST HANDLE *lpHandles, // 鍙ユ焺鏁扮粍棣栧湴鍧 銆BOOL fWaitAll, // 絳夊緟鏍囧織 銆DWORD dwMilliseconds // 絳夊緟鏃墮棿闂撮殧 );
銆銆鍙傛暟nCount鎸囧畾浜嗚絳夊緟鐨勫唴鏍稿璞$殑鏁扮洰錛屽瓨鏀捐繖浜涘唴鏍稿璞$殑鏁扮粍鐢眑pHandles鏉ユ寚鍚戙俧WaitAll瀵規寚瀹氱殑榪檔Count涓唴鏍稿璞$殑涓ょ絳夊緟鏂瑰紡榪涜浜嗘寚瀹氾紝涓篢RUE鏃跺綋鎵鏈夊璞¢兘琚氱煡鏃跺嚱鏁版墠浼氳繑鍥烇紝涓篎ALSE鍒欏彧瑕佸叾涓換浣曚竴涓緱鍒伴氱煡灝卞彲浠ヨ繑鍥炪俤wMilliseconds鍦ㄨ繖閲岀殑浣滅敤涓庡湪WaitForSingleObject錛堬級涓殑浣滅敤鏄畬鍏ㄤ竴鑷寸殑銆傚鏋滅瓑寰呰秴鏃訛紝鍑芥暟灝嗚繑鍥濿AIT_TIMEOUT銆傚鏋滆繑鍥濿AIT_OBJECT_0鍒癢AIT_OBJECT_0+nCount-1涓殑鏌愪釜鍊鹼紝鍒欒鏄庢墍鏈夋寚瀹氬璞$殑鐘舵佸潎涓哄凡閫氱煡鐘舵侊紙褰揻WaitAll涓篢RUE鏃訛級鎴栨槸鐢ㄤ互鍑忓幓WAIT_OBJECT_0鑰屽緱鍒板彂鐢熼氱煡鐨勫璞$殑绱㈠紩錛堝綋fWaitAll涓篎ALSE鏃訛級銆傚鏋滆繑鍥炲煎湪WAIT_ABANDONED_0涓嶹AIT_ABANDONED_0+nCount-1涔嬮棿錛屽垯琛ㄧず鎵鏈夋寚瀹氬璞$殑鐘舵佸潎涓哄凡閫氱煡錛屼笖鍏朵腑鑷沖皯鏈変竴涓璞℃槸琚涪寮冪殑浜掓枼瀵硅薄錛堝綋fWaitAll涓篢RUE鏃訛級錛屾垨鏄敤浠ュ噺鍘籛AIT_OBJECT_0琛ㄧず涓涓瓑寰呮甯哥粨鏉熺殑浜掓枼瀵硅薄鐨勭儲寮曪紙褰揻WaitAll涓篎ALSE鏃訛級銆?涓嬮潰緇欏嚭鐨勪唬鐮佷富瑕佸睍紺轟簡瀵筗aitForMultipleObjects錛堬級鍑芥暟鐨勪嬌鐢ㄣ傞氳繃瀵逛袱涓簨浠跺唴鏍稿璞$殑絳夊緟鏉ユ帶鍒剁嚎紼嬩換鍔$殑鎵ц涓庝腑閫旈鍑猴細
// 瀛樻斁浜嬩歡鍙ユ焺鐨勬暟緇?br>HANDLE hEvents[2]; UINT ThreadProc14(LPVOID pParam) { 銆// 絳夊緟寮鍚簨浠?br>銆DWORD dwRet1 = WaitForMultipleObjects(2, hEvents, FALSE, INFINITE); 銆// 濡傛灉寮鍚簨浠跺埌杈懼垯綰跨▼寮濮嬫墽琛屼換鍔?br>銆if (dwRet1 == WAIT_OBJECT_0) 銆{ 銆銆AfxMessageBox("綰跨▼寮濮嬪伐浣?"); 銆銆while (true) 銆銆{ 銆銆銆for (int i = 0; i < 10000; i++); 銆銆銆// 鍦ㄤ換鍔″鐞嗚繃紼嬩腑絳夊緟緇撴潫浜嬩歡 銆銆銆DWORD dwRet2 = WaitForMultipleObjects(2, hEvents, FALSE, 0); 銆銆銆// 濡傛灉緇撴潫浜嬩歡緗綅鍒欑珛鍗崇粓姝換鍔$殑鎵ц 銆銆銆if (dwRet2 == WAIT_OBJECT_0 + 1) 銆銆銆銆break; 銆銆} 銆} 銆AfxMessageBox("綰跨▼閫鍑?"); 銆return 0; } …… void CSample08View::OnStartEvent() { 銆// 鍒涘緩綰跨▼ 銆for (int i = 0; i < 2; i++) 銆銆hEvents[i] = CreateEvent(NULL, FALSE, FALSE, NULL); 銆銆// 寮鍚嚎紼?br>銆銆AfxBeginThread(ThreadProc14, NULL); 銆銆// 璁劇疆浜嬩歡0(寮鍚簨浠? 銆銆SetEvent(hEvents[0]); } void CSample08View::OnEndevent() { 銆// 璁劇疆浜嬩歡1(緇撴潫浜嬩歡) 銆SetEvent(hEvents[1]); }
銆銆MFC涓轟簨浠剁浉鍏沖鐞嗕篃鎻愪緵浜嗕竴涓狢Event綾伙紝鍏卞寘鍚湁闄ゆ瀯閫犲嚱鏁板鐨?涓垚鍛樺嚱鏁癙ulseEvent錛堬級銆丷esetEvent錛堬級銆丼etEvent錛堬級鍜孶nLock錛堬級銆傚湪鍔熻兘涓婂垎鍒浉褰撲笌Win32 API鐨凱ulseEvent錛堬級銆丷esetEvent錛堬級銆丼etEvent錛堬級鍜孋loseHandle錛堬級絳夊嚱鏁般傝屾瀯閫犲嚱鏁板垯灞ヨ浜嗗師CreateEvent錛堬級鍑芥暟鍒涘緩浜嬩歡瀵硅薄鐨勮亴璐o紝鍏跺嚱鏁板師鍨嬩負錛?br>
CEvent(BOOL bInitiallyOwn = FALSE, BOOL bManualReset = FALSE, LPCTSTR lpszName = NULL, LPSECURITY_ATTRIBUTES lpsaAttribute = NULL );
銆銆鎸夌収姝ょ己鐪佽緗皢鍒涘緩涓涓嚜鍔ㄥ浣嶃佸垵濮嬬姸鎬佷負澶嶄綅鐘舵佺殑娌℃湁鍚嶅瓧鐨勪簨浠跺璞°傚皝瑁呭悗鐨凜Event綾諱嬌鐢ㄨ搗鏉ユ洿鍔犳柟渚匡紝鍥?鍗沖睍紺轟簡CEvent綾誨A銆丅涓ょ嚎紼嬬殑鍚屾榪囩▼錛?br> 鍥? CEvent綾誨綰跨▼鐨勫悓姝ヨ繃紼嬬ず鎰?br> 銆銆B綰跨▼鍦ㄦ墽琛屽埌CEvent綾繪垚鍛樺嚱鏁癓ock錛堬級鏃跺皢浼氬彂鐢熼樆濉烇紝鑰孉綰跨▼姝ゆ椂鍒欏彲浠ュ湪娌℃湁B綰跨▼騫叉壈鐨勬儏鍐典笅瀵瑰叡浜祫婧愯繘琛屽鐞嗭紝騫跺湪澶勭悊瀹屾垚鍚庨氳繃鎴愬憳鍑芥暟SetEvent錛堬級鍚態鍙戝嚭浜嬩歡錛屼嬌鍏惰閲婃斁錛屽緱浠ュA鍏堝墠宸插鐞嗗畬姣曠殑鍏變韓璧勬簮榪涜鎿嶄綔銆傚彲瑙侊紝浣跨敤CEvent綾誨綰跨▼鐨勫悓姝ユ柟娉曚笌閫氳繃API鍑芥暟榪涜綰跨▼鍚屾鐨勫鐞嗘柟娉曟槸鍩烘湰涓鑷寸殑銆傚墠闈㈢殑API澶勭悊浠g爜鍙敤CEvent綾誨皢鍏舵敼鍐欎負錛?br>
// MFC浜嬩歡綾誨璞?br>CEvent g_clsEvent; UINT ThreadProc22(LPVOID pParam) { 銆// 瀵瑰叡浜祫婧愯繘琛屽啓鍏ユ搷浣?br>銆for (int i = 0; i < 10; i++) 銆{ 銆銆g_cArray[i] = 'a'; 銆銆Sleep(1); 銆} 銆// 浜嬩歡緗綅 銆g_clsEvent.SetEvent(); 銆return 0; } UINT ThreadProc23(LPVOID pParam) { 銆// 絳夊緟浜嬩歡 銆g_clsEvent.Lock(); 銆// 瀵瑰叡浜祫婧愯繘琛屽啓鍏ユ搷浣?br>銆for (int i = 0; i < 10; i++) 銆{ 銆銆g_cArray[10 - i - 1] = 'b'; 銆銆Sleep(1); 銆} 銆return 0; } …… void CSample08View::OnEventMfc() { 銆// 鍚姩綰跨▼ 銆AfxBeginThread(ThreadProc22, NULL); 銆AfxBeginThread(ThreadProc23, NULL); 銆// 絳夊緟璁$畻瀹屾瘯 銆Sleep(300); 銆// 鎶ュ憡璁$畻緇撴灉 銆CString sResult = CString(g_cArray); 銆AfxMessageBox(sResult); }
淇″彿閲忓唴鏍稿璞?br> 銆銆淇″彿閲忥紙Semaphore錛夊唴鏍稿璞″綰跨▼鐨勫悓姝ユ柟寮忎笌鍓嶉潰鍑犵鏂規硶涓嶅悓錛屽畠鍏佽澶氫釜綰跨▼鍦ㄥ悓涓鏃跺埢璁塊棶鍚屼竴璧勬簮錛屼絾鏄渶瑕侀檺鍒跺湪鍚屼竴鏃跺埢璁塊棶姝よ祫婧愮殑鏈澶х嚎紼嬫暟鐩傚湪鐢–reateSemaphore錛堬級鍒涘緩淇″彿閲忔椂鍗寵鍚屾椂鎸囧嚭鍏佽鐨勬渶澶ц祫婧愯鏁板拰褰撳墠鍙敤璧勬簮璁℃暟銆備竴鑸槸灝嗗綋鍓嶅彲鐢ㄨ祫婧愯鏁拌緗負鏈澶ц祫婧愯鏁幫紝姣忓鍔犱竴涓嚎紼嬪鍏變韓璧勬簮鐨勮闂紝褰撳墠鍙敤璧勬簮璁℃暟灝變細鍑?錛屽彧瑕佸綋鍓嶅彲鐢ㄨ祫婧愯鏁版槸澶т簬0鐨勶紝灝卞彲浠ュ彂鍑轟俊鍙烽噺淇″彿銆備絾鏄綋鍓嶅彲鐢ㄨ鏁板噺灝忓埌0鏃跺垯璇存槑褰撳墠鍗犵敤璧勬簮鐨勭嚎紼嬫暟宸茬粡杈懼埌浜嗘墍鍏佽鐨勬渶澶ф暟鐩紝涓嶈兘鍦ㄥ厑璁稿叾浠栫嚎紼嬬殑榪涘叆錛屾鏃剁殑淇″彿閲忎俊鍙峰皢鏃犳硶鍙戝嚭銆傜嚎紼嬪湪澶勭悊瀹屽叡浜祫婧愬悗錛屽簲鍦ㄧ寮鐨勫悓鏃墮氳繃ReleaseSemaphore錛堬級鍑芥暟灝嗗綋鍓嶅彲鐢ㄨ祫婧愯鏁板姞1銆傚湪浠諱綍鏃跺欏綋鍓嶅彲鐢ㄨ祫婧愯鏁板喅涓嶅彲鑳藉ぇ浜庢渶澶ц祫婧愯鏁般?br> 鍥? 浣跨敤淇″彿閲忓璞℃帶鍒惰祫婧?br> 銆銆涓嬮潰緇撳悎鍥句緥3鏉ユ紨紺轟俊鍙烽噺瀵硅薄瀵硅祫婧愮殑鎺у埗銆傚湪鍥?涓紝浠ョ澶村拰鐧借壊綆ご琛ㄧず鍏變韓璧勬簮鎵鍏佽鐨勬渶澶ц祫婧愯鏁板拰褰撳墠鍙敤璧勬簮璁℃暟銆傚垵濮嬪鍥撅紙a錛夋墍紺猴紝鏈澶ц祫婧愯鏁板拰褰撳墠鍙敤璧勬簮璁℃暟鍧囦負4錛屾鍚庢瘡澧炲姞涓涓璧勬簮榪涜璁塊棶鐨勭嚎紼嬶紙鐢ㄩ粦鑹茬澶磋〃紺猴級褰撳墠璧勬簮璁℃暟灝變細鐩稿簲鍑?錛屽浘錛坆錛夊嵆琛ㄧず鐨勫湪3涓嚎紼嬪鍏變韓璧勬簮榪涜璁塊棶鏃剁殑鐘舵併傚綋榪涘叆綰跨▼鏁拌揪鍒?涓椂錛屽皢濡傚浘錛坈錛夋墍紺猴紝姝ゆ椂宸茶揪鍒版渶澶ц祫婧愯鏁幫紝鑰屽綋鍓嶅彲鐢ㄨ祫婧愯鏁頒篃宸插噺鍒?錛屽叾浠栫嚎紼嬫棤娉曞鍏變韓璧勬簮榪涜璁塊棶銆傚湪褰撳墠鍗犳湁璧勬簮鐨勭嚎紼嬪鐞嗗畬姣曡岄鍑哄悗錛屽皢浼氶噴鏀懼嚭絀洪棿錛屽浘錛坉錛夊凡鏈変袱涓嚎紼嬮鍑哄璧勬簮鐨勫崰鏈夛紝褰撳墠鍙敤璁℃暟涓?錛屽彲浠ュ啀鍏佽2涓嚎紼嬭繘鍏ュ埌瀵硅祫婧愮殑澶勭悊銆傚彲浠ョ湅鍑猴紝淇″彿閲忔槸閫氳繃璁℃暟鏉ュ綰跨▼璁塊棶璧勬簮榪涜鎺у埗鐨勶紝鑰屽疄闄呬笂淇″彿閲忕‘瀹炰篃琚О浣淒ijkstra璁℃暟鍣ㄣ?br> 銆銆浣跨敤淇″彿閲忓唴鏍稿璞¤繘琛岀嚎紼嬪悓姝ヤ富瑕佷細鐢ㄥ埌CreateSemaphore錛堬級銆丱penSemaphore錛堬級銆丷eleaseSemaphore錛堬級銆乄aitForSingleObject錛堬級鍜學aitForMultipleObjects錛堬級絳夊嚱鏁般傚叾涓紝CreateSemaphore錛堬級鐢ㄦ潵鍒涘緩涓涓俊鍙烽噺鍐呮牳瀵硅薄錛屽叾鍑芥暟鍘熷瀷涓猴細
HANDLE CreateSemaphore( 銆LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, // 瀹夊叏灞炴ф寚閽?br>銆LONG lInitialCount, // 鍒濆璁℃暟 銆LONG lMaximumCount, // 鏈澶ц鏁?br>銆LPCTSTR lpName // 瀵硅薄鍚嶆寚閽?br>);
銆銆鍙傛暟lMaximumCount鏄竴涓湁絎﹀彿32浣嶅鹼紝瀹氫箟浜嗗厑璁哥殑鏈澶ц祫婧愯鏁幫紝鏈澶у彇鍊間笉鑳借秴榪?294967295銆俵pName鍙傛暟鍙互涓哄垱寤虹殑淇″彿閲忓畾涔変竴涓悕瀛楋紝鐢變簬鍏跺垱寤虹殑鏄竴涓唴鏍稿璞★紝鍥犳鍦ㄥ叾浠栬繘紼嬩腑鍙互閫氳繃璇ュ悕瀛楄屽緱鍒版淇″彿閲忋侽penSemaphore錛堬級鍑芥暟鍗沖彲鐢ㄦ潵鏍規嵁淇″彿閲忓悕鎵撳紑鍦ㄥ叾浠栬繘紼嬩腑鍒涘緩鐨勪俊鍙烽噺錛屽嚱鏁板師鍨嬪涓嬶細
HANDLE OpenSemaphore( 銆DWORD dwDesiredAccess, // 璁塊棶鏍囧織 銆BOOL bInheritHandle, // 緇ф壙鏍囧織 銆LPCTSTR lpName // 淇″彿閲忓悕 );
銆銆鍦ㄧ嚎紼嬬寮瀵瑰叡浜祫婧愮殑澶勭悊鏃訛紝蹇呴』閫氳繃ReleaseSemaphore錛堬級鏉ュ鍔犲綋鍓嶅彲鐢ㄨ祫婧愯鏁般傚惁鍒欏皢浼氬嚭鐜板綋鍓嶆鍦ㄥ鐞嗗叡浜祫婧愮殑瀹為檯綰跨▼鏁板茍娌℃湁杈懼埌瑕侀檺鍒剁殑鏁板鹼紝鑰屽叾浠栫嚎紼嬪嵈鍥犱負褰撳墠鍙敤璧勬簮璁℃暟涓?鑰屼粛鏃犳硶榪涘叆鐨勬儏鍐點俁eleaseSemaphore錛堬級鐨勫嚱鏁板師鍨嬩負錛?br>
BOOL ReleaseSemaphore( 銆HANDLE hSemaphore, // 淇″彿閲忓彞鏌?br>銆LONG lReleaseCount, // 璁℃暟閫掑鏁伴噺 銆LPLONG lpPreviousCount // 鍏堝墠璁℃暟 );
銆銆璇ュ嚱鏁板皢lReleaseCount涓殑鍊兼坊鍔犵粰淇″彿閲忕殑褰撳墠璧勬簮璁℃暟錛屼竴鑸皢lReleaseCount璁劇疆涓?錛屽鏋滈渶瑕佷篃鍙互璁劇疆鍏朵粬鐨勫箋俉aitForSingleObject錛堬級鍜學aitForMultipleObjects錛堬級涓昏鐢ㄥ湪璇曞浘榪涘叆鍏變韓璧勬簮鐨勭嚎紼嬪嚱鏁板叆鍙e錛屼富瑕佺敤鏉ュ垽鏂俊鍙烽噺鐨勫綋鍓嶅彲鐢ㄨ祫婧愯鏁版槸鍚﹀厑璁告湰綰跨▼鐨勮繘鍏ャ傚彧鏈夊湪褰撳墠鍙敤璧勬簮璁℃暟鍊煎ぇ浜?鏃訛紝琚洃瑙嗙殑淇″彿閲忓唴鏍稿璞℃墠浼氬緱鍒伴氱煡銆?br> 銆銆淇″彿閲忕殑浣跨敤鐗圭偣浣垮叾鏇撮傜敤浜庡Socket錛堝鎺ュ瓧錛夌▼搴忎腑綰跨▼鐨勫悓姝ャ備緥濡傦紝緗戠粶涓婄殑HTTP鏈嶅姟鍣ㄨ瀵瑰悓涓鏃墮棿鍐呰闂悓涓欏甸潰鐨勭敤鎴鋒暟鍔犱互闄愬埗錛岃繖鏃跺彲浠ヤ負娌′竴涓敤鎴峰鏈嶅姟鍣ㄧ殑欏甸潰璇鋒眰璁劇疆涓涓嚎紼嬶紝鑰岄〉闈㈠垯鏄緟淇濇姢鐨勫叡浜祫婧愶紝閫氳繃浣跨敤淇″彿閲忓綰跨▼鐨勫悓姝ヤ綔鐢ㄥ彲浠ョ‘淇濆湪浠諱竴鏃跺埢鏃犺鏈夊灝戠敤鎴峰鏌愪竴欏甸潰榪涜璁塊棶錛屽彧鏈変笉澶т簬璁懼畾鐨勬渶澶х敤鎴鋒暟鐩殑綰跨▼鑳藉榪涜璁塊棶錛岃屽叾浠栫殑璁塊棶浼佸浘鍒欒鎸傝搗錛屽彧鏈夊湪鏈夌敤鎴烽鍑哄姝ら〉闈㈢殑璁塊棶鍚庢墠鏈夊彲鑳借繘鍏ャ備笅闈㈢粰鍑虹殑紺轟緥浠g爜鍗沖睍紺轟簡綾諱技鐨勫鐞嗚繃紼嬶細
// 淇″彿閲忓璞″彞鏌?br>HANDLE hSemaphore; UINT ThreadProc15(LPVOID pParam) { 銆// 璇曞浘榪涘叆淇″彿閲忓叧鍙?br>銆WaitForSingleObject(hSemaphore, INFINITE); 銆// 綰跨▼浠誨姟澶勭悊 銆AfxMessageBox("綰跨▼涓姝e湪鎵ц!"); 銆// 閲婃斁淇″彿閲忚鏁?br>銆ReleaseSemaphore(hSemaphore, 1, NULL); 銆return 0; } UINT ThreadProc16(LPVOID pParam) { 銆// 璇曞浘榪涘叆淇″彿閲忓叧鍙?br>銆WaitForSingleObject(hSemaphore, INFINITE); 銆// 綰跨▼浠誨姟澶勭悊 銆AfxMessageBox("綰跨▼浜屾鍦ㄦ墽琛?"); 銆// 閲婃斁淇″彿閲忚鏁?br>銆ReleaseSemaphore(hSemaphore, 1, NULL); 銆return 0; } UINT ThreadProc17(LPVOID pParam) { 銆// 璇曞浘榪涘叆淇″彿閲忓叧鍙?br>銆WaitForSingleObject(hSemaphore, INFINITE); 銆// 綰跨▼浠誨姟澶勭悊 銆AfxMessageBox("綰跨▼涓夋鍦ㄦ墽琛?"); 銆// 閲婃斁淇″彿閲忚鏁?br>銆ReleaseSemaphore(hSemaphore, 1, NULL); 銆return 0; } …… void CSample08View::OnSemaphore() { 銆// 鍒涘緩淇″彿閲忓璞?br>銆hSemaphore = CreateSemaphore(NULL, 2, 2, NULL); 銆// 寮鍚嚎紼?br>銆AfxBeginThread(ThreadProc15, NULL); 銆AfxBeginThread(ThreadProc16, NULL); 銆AfxBeginThread(ThreadProc17, NULL); }
鍥? 寮濮嬭繘鍏ョ殑涓や釜綰跨▼ 鍥? 綰跨▼浜岄鍑哄悗綰跨▼涓夋墠寰椾互榪涘叆 銆銆涓婅堪浠g爜鍦ㄥ紑鍚嚎紼嬪墠棣栧厛鍒涘緩浜嗕竴涓垵濮嬭鏁板拰鏈澶ц祫婧愯鏁板潎涓?鐨勪俊鍙烽噺瀵硅薄hSemaphore銆傚嵆鍦ㄥ悓涓鏃跺埢鍙厑璁?涓嚎紼嬭繘鍏ョ敱hSemaphore淇濇姢鐨勫叡浜祫婧愩傞殢鍚庡紑鍚殑涓変釜綰跨▼鍧囪瘯鍥捐闂鍏變韓璧勬簮錛屽湪鍓嶄袱涓嚎紼嬭瘯鍥捐闂叡浜祫婧愭椂錛岀敱浜巋Semaphore鐨勫綋鍓嶅彲鐢ㄨ祫婧愯鏁板垎鍒負2鍜?錛屾鏃剁殑hSemaphore鏄彲浠ュ緱鍒伴氱煡鐨勶紝涔熷氨鏄浣嶄簬綰跨▼鍏ュ彛澶勭殑WaitForSingleObject錛堬級灝嗙珛鍗寵繑鍥烇紝鑰屽湪鍓嶄袱涓嚎紼嬭繘鍏ュ埌淇濇姢鍖哄煙鍚庯紝hSemaphore鐨勫綋鍓嶈祫婧愯鏁板噺灝戝埌0錛宧Semaphore灝嗕笉鍐嶅緱鍒伴氱煡錛學aitForSingleObject錛堬級灝嗙嚎紼嬫寕璧楓傜洿鍒版鍓嶈繘鍏ュ埌淇濇姢鍖虹殑綰跨▼閫鍑哄悗鎵嶈兘寰椾互榪涘叆銆傚浘4鍜屽浘5涓轟笂榪頒唬鑴夌殑榪愯緇撴灉銆備粠瀹為獙緇撴灉鍙互鐪嬪嚭錛屼俊鍙烽噺濮嬬粓淇濇寔浜嗗悓涓鏃跺埢涓嶈秴榪?涓嚎紼嬬殑榪涘叆銆?br> 銆銆鍦∕FC涓紝閫氳繃CSemaphore綾誨淇″彿閲忎綔浜嗚〃榪般傝綾誨彧鍏鋒湁涓涓瀯閫犲嚱鏁幫紝鍙互鏋勯犱竴涓俊鍙烽噺瀵硅薄錛屽茍瀵瑰垵濮嬭祫婧愯鏁般佹渶澶ц祫婧愯鏁般佸璞″悕鍜屽畨鍏ㄥ睘鎬х瓑榪涜鍒濆鍖栵紝鍏跺師鍨嬪涓嬶細
CSemaphore( LONG lInitialCount = 1, LONG lMaxCount = 1, LPCTSTR pstrName = NULL, LPSECURITY_ATTRIBUTES lpsaAttributes = NULL );
銆銆鍦ㄦ瀯閫犱簡CSemaphore綾誨璞″悗錛屼換浣曚竴涓闂彈淇濇姢鍏變韓璧勬簮鐨勭嚎紼嬮兘蹇呴』閫氳繃CSemaphore浠庣埗綾籆SyncObject綾葷戶鎵垮緱鍒扮殑Lock錛堬級鍜孶nLock錛堬級鎴愬憳鍑芥暟鏉ヨ闂垨閲婃斁CSemaphore瀵硅薄銆備笌鍓嶉潰浠嬬粛鐨勫嚑縐嶉氳繃MFC綾諱繚鎸佺嚎紼嬪悓姝ョ殑鏂規硶綾諱技錛岄氳繃CSemaphore綾諱篃鍙互灝嗗墠闈㈢殑綰跨▼鍚屾浠g爜榪涜鏀瑰啓錛岃繖涓ょ浣跨敤淇″彿閲忕殑綰跨▼鍚屾鏂規硶鏃犺鏄湪瀹炵幇鍘熺悊涓婅繕鏄粠瀹炵幇緇撴灉涓婇兘鏄畬鍏ㄤ竴鑷寸殑銆備笅闈㈢粰鍑虹粡MFC鏀瑰啓鍚庣殑淇″彿閲忕嚎紼嬪悓姝ヤ唬鐮侊細
// MFC淇″彿閲忕被瀵硅薄 CSemaphore g_clsSemaphore(2, 2); UINT ThreadProc24(LPVOID pParam) { 銆// 璇曞浘榪涘叆淇″彿閲忓叧鍙?br>銆g_clsSemaphore.Lock(); 銆// 綰跨▼浠誨姟澶勭悊 銆AfxMessageBox("綰跨▼涓姝e湪鎵ц!"); 銆// 閲婃斁淇″彿閲忚鏁?br>銆g_clsSemaphore.Unlock(); 銆return 0; } UINT ThreadProc25(LPVOID pParam) { 銆// 璇曞浘榪涘叆淇″彿閲忓叧鍙?br>銆g_clsSemaphore.Lock(); 銆// 綰跨▼浠誨姟澶勭悊 銆AfxMessageBox("綰跨▼浜屾鍦ㄦ墽琛?"); 銆// 閲婃斁淇″彿閲忚鏁?br>銆g_clsSemaphore.Unlock(); 銆return 0; } UINT ThreadProc26(LPVOID pParam) { 銆// 璇曞浘榪涘叆淇″彿閲忓叧鍙?br>銆g_clsSemaphore.Lock(); 銆// 綰跨▼浠誨姟澶勭悊 銆AfxMessageBox("綰跨▼涓夋鍦ㄦ墽琛?"); 銆// 閲婃斁淇″彿閲忚鏁?br>銆g_clsSemaphore.Unlock(); 銆return 0; } …… void CSample08View::OnSemaphoreMfc() { 銆// 寮鍚嚎紼?br>銆AfxBeginThread(ThreadProc24, NULL); 銆AfxBeginThread(ThreadProc25, NULL); 銆AfxBeginThread(ThreadProc26, NULL); }
浜掓枼鍐呮牳瀵硅薄 銆銆浜掓枼錛圡utex錛夋槸涓縐嶇敤閫旈潪甯稿箍娉涚殑鍐呮牳瀵硅薄銆傝兘澶熶繚璇佸涓嚎紼嬪鍚屼竴鍏變韓璧勬簮鐨勪簰鏂ヨ闂傚悓涓寸晫鍖烘湁浜涚被浼鹼紝鍙湁鎷ユ湁浜掓枼瀵硅薄鐨勭嚎紼嬫墠鍏鋒湁璁塊棶璧勬簮鐨勬潈闄愶紝鐢變簬浜掓枼瀵硅薄鍙湁涓涓紝鍥犳灝卞喅瀹氫簡浠諱綍鎯呭喌涓嬫鍏變韓璧勬簮閮戒笉浼氬悓鏃惰澶氫釜綰跨▼鎵璁塊棶銆傚綋鍓嶅崰鎹祫婧愮殑綰跨▼鍦ㄤ換鍔″鐞嗗畬鍚庡簲灝嗘嫢鏈夌殑浜掓枼瀵硅薄浜ゅ嚭錛屼互渚垮叾浠栫嚎紼嬪湪鑾峰緱鍚庡緱浠ヨ闂祫婧愩備笌鍏朵粬鍑犵鍐呮牳瀵硅薄涓嶅悓錛屼簰鏂ュ璞″湪鎿嶄綔緋葷粺涓嫢鏈夌壒孌婁唬鐮侊紝騫剁敱鎿嶄綔緋葷粺鏉ョ鐞嗭紝鎿嶄綔緋葷粺鐢氳嚦榪樺厑璁稿叾榪涜涓浜涘叾浠栧唴鏍稿璞℃墍涓嶈兘榪涜鐨勯潪甯歌鎿嶄綔銆備負渚夸簬鐞嗚В錛屽彲鍙傜収鍥?緇欏嚭鐨勪簰鏂ュ唴鏍稿璞$殑宸ヤ綔妯″瀷錛?br> 鍥? 浣跨敤浜掓枼鍐呮牳瀵硅薄瀵瑰叡浜祫婧愮殑淇濇姢 銆銆鍥撅紙a錛変腑鐨勭澶翠負瑕佽闂祫婧愶紙鐭╁艦妗嗭級鐨勭嚎紼嬶紝浣嗗彧鏈夌浜屼釜綰跨▼鎷ユ湁浜掓枼瀵硅薄錛堥粦鐐癸級騫跺緱浠ヨ繘鍏ュ埌鍏變韓璧勬簮錛岃屽叾浠栫嚎紼嬪垯浼氳鎺掓枼鍦ㄥ錛堝鍥撅紙b錛夋墍紺猴級銆傚綋姝ょ嚎紼嬪鐞嗗畬鍏變韓璧勬簮騫跺噯澶囩寮姝ゅ尯鍩熸椂灝嗘妸鍏舵墍鎷ユ湁鐨勪簰鏂ュ璞′氦鍑猴紙濡傚浘錛坈錛夋墍紺猴級錛屽叾浠栦換浣曚竴涓瘯鍥捐闂璧勬簮鐨勭嚎紼嬮兘鏈夋満浼氬緱鍒版浜掓枼瀵硅薄銆?br> 銆銆浠ヤ簰鏂ュ唴鏍稿璞℃潵淇濇寔綰跨▼鍚屾鍙兘鐢ㄥ埌鐨勫嚱鏁頒富瑕佹湁CreateMutex錛堬級銆丱penMutex錛堬級銆丷eleaseMutex錛堬級銆乄aitForSingleObject錛堬級鍜學aitForMultipleObjects錛堬級絳夈傚湪浣跨敤浜掓枼瀵硅薄鍓嶏紝棣栧厛瑕侀氳繃CreateMutex錛堬級鎴朞penMutex錛堬級鍒涘緩鎴栨墦寮涓涓簰鏂ュ璞°侰reateMutex錛堬級鍑芥暟鍘熷瀷涓猴細
HANDLE CreateMutex( 銆LPSECURITY_ATTRIBUTES lpMutexAttributes, // 瀹夊叏灞炴ф寚閽?br>銆BOOL bInitialOwner, // 鍒濆鎷ユ湁鑰?br>銆LPCTSTR lpName // 浜掓枼瀵硅薄鍚?br>);
銆銆鍙傛暟bInitialOwner涓昏鐢ㄦ潵鎺у埗浜掓枼瀵硅薄鐨勫垵濮嬬姸鎬併備竴鑸灝嗗叾璁劇疆涓篎ALSE錛屼互琛ㄦ槑浜掓枼瀵硅薄鍦ㄥ垱寤烘椂騫舵病鏈変負浠諱綍綰跨▼鎵鍗犳湁銆傚鏋滃湪鍒涘緩浜掓枼瀵硅薄鏃舵寚瀹氫簡瀵硅薄鍚嶏紝閭d箞鍙互鍦ㄦ湰榪涚▼鍏朵粬鍦版柟鎴栨槸鍦ㄥ叾浠栬繘紼嬮氳繃OpenMutex錛堬級鍑芥暟寰楀埌姝や簰鏂ュ璞$殑鍙ユ焺銆侽penMutex錛堬級鍑芥暟鍘熷瀷涓猴細
HANDLE OpenMutex( 銆DWORD dwDesiredAccess, // 璁塊棶鏍囧織 銆BOOL bInheritHandle, // 緇ф壙鏍囧織 銆LPCTSTR lpName // 浜掓枼瀵硅薄鍚?br>);
銆銆褰撶洰鍓嶅璧勬簮鍏鋒湁璁塊棶鏉冪殑綰跨▼涓嶅啀闇瑕佽闂璧勬簮鑰岃紱誨紑鏃訛紝蹇呴』閫氳繃ReleaseMutex錛堬級鍑芥暟鏉ラ噴鏀懼叾鎷ユ湁鐨勪簰鏂ュ璞★紝鍏跺嚱鏁板師鍨嬩負錛?br>
BOOL ReleaseMutex(HANDLE hMutex);
銆銆鍏跺敮涓鐨勫弬鏁癶Mutex涓哄緟閲婃斁鐨勪簰鏂ュ璞″彞鏌勩傝嚦浜嶹aitForSingleObject錛堬級鍜學aitForMultipleObjects錛堬級絳夊緟鍑芥暟鍦ㄤ簰鏂ュ璞′繚鎸佺嚎紼嬪悓姝ヤ腑鎵璧風殑浣滅敤涓庡湪鍏朵粬鍐呮牳瀵硅薄涓殑浣滅敤鏄熀鏈竴鑷寸殑錛屼篃鏄瓑寰呬簰鏂ュ唴鏍稿璞$殑閫氱煡銆備絾鏄繖閲岄渶瑕佺壒鍒寚鍑虹殑鏄細鍦ㄤ簰鏂ュ璞¢氱煡寮曡搗璋冪敤絳夊緟鍑芥暟榪斿洖鏃訛紝絳夊緟鍑芥暟鐨勮繑鍥炲間笉鍐嶆槸閫氬父鐨刉AIT_OBJECT_0錛堝浜嶹aitForSingleObject錛堬級鍑芥暟錛夋垨鏄湪WAIT_OBJECT_0鍒癢AIT_OBJECT_0+nCount-1涔嬮棿鐨勪竴涓鹼紙瀵逛簬WaitForMultipleObjects錛堬級鍑芥暟錛夛紝鑰屾槸灝嗚繑鍥炰竴涓猈AIT_ABANDONED_0錛堝浜嶹aitForSingleObject錛堬級鍑芥暟錛夋垨鏄湪WAIT_ABANDONED_0鍒癢AIT_ABANDONED_0+nCount-1涔嬮棿鐨勪竴涓鹼紙瀵逛簬WaitForMultipleObjects錛堬級鍑芥暟錛夈備互姝ゆ潵琛ㄦ槑綰跨▼姝e湪絳夊緟鐨勪簰鏂ュ璞$敱鍙﹀涓涓嚎紼嬫墍鎷ユ湁錛岃屾綰跨▼鍗村湪浣跨敤瀹屽叡浜祫婧愬墠灝卞凡緇忕粓姝€傞櫎姝や箣澶栵紝浣跨敤浜掓枼瀵硅薄鐨勬柟娉曞湪絳夊緟綰跨▼鐨勫彲璋冨害鎬т笂鍚屼嬌鐢ㄥ叾浠栧嚑縐嶅唴鏍稿璞$殑鏂規硶涔熸湁鎵涓嶅悓錛屽叾浠栧唴鏍稿璞″湪娌℃湁寰楀埌閫氱煡鏃訛紝鍙楄皟鐢ㄧ瓑寰呭嚱鏁扮殑浣滅敤錛岀嚎紼嬪皢浼氭寕璧鳳紝鍚屾椂澶卞幓鍙皟搴︽э紝鑰屼嬌鐢ㄤ簰鏂ョ殑鏂規硶鍗村彲浠ュ湪絳夊緟鐨勫悓鏃朵粛鍏鋒湁鍙皟搴︽э紝榪欎篃姝f槸浜掓枼瀵硅薄鎵鑳藉畬鎴愮殑闈炲父瑙勬搷浣滀箣涓銆?br> 銆銆鍦ㄧ紪鍐欑▼搴忔椂錛屼簰鏂ュ璞″鐢ㄥ湪瀵歸偅浜涗負澶氫釜綰跨▼鎵璁塊棶鐨勫唴瀛樺潡鐨勪繚鎶や笂錛屽彲浠ョ‘淇濅換浣曠嚎紼嬪湪澶勭悊姝ゅ唴瀛樺潡鏃墮兘瀵瑰叾鎷ユ湁鍙潬鐨勭嫭鍗犺闂潈銆備笅闈㈢粰鍑虹殑紺轟緥浠g爜鍗抽氳繃浜掓枼鍐呮牳瀵硅薄hMutex瀵瑰叡浜唴瀛樺揩g_cArray[]榪涜綰跨▼鐨勭嫭鍗犺闂繚鎶ゃ備笅闈㈢粰鍑哄疄鐜頒唬鐮佹竻鍗曪細
// 浜掓枼瀵硅薄 HANDLE hMutex = NULL; char g_cArray[10]; UINT ThreadProc18(LPVOID pParam) { 銆// 絳夊緟浜掓枼瀵硅薄閫氱煡 銆WaitForSingleObject(hMutex, INFINITE); 銆// 瀵瑰叡浜祫婧愯繘琛屽啓鍏ユ搷浣?br>銆for (int i = 0; i < 10; i++) 銆{ 銆銆g_cArray[i] = 'a'; 銆銆Sleep(1); 銆} 銆// 閲婃斁浜掓枼瀵硅薄 銆ReleaseMutex(hMutex); 銆return 0; } UINT ThreadProc19(LPVOID pParam) { 銆// 絳夊緟浜掓枼瀵硅薄閫氱煡 銆WaitForSingleObject(hMutex, INFINITE); 銆// 瀵瑰叡浜祫婧愯繘琛屽啓鍏ユ搷浣?br>銆for (int i = 0; i < 10; i++) 銆{ 銆銆g_cArray[10 - i - 1] = 'b'; 銆銆Sleep(1); 銆} 銆// 閲婃斁浜掓枼瀵硅薄 銆ReleaseMutex(hMutex); 銆return 0; } …… void CSample08View::OnMutex() { 銆// 鍒涘緩浜掓枼瀵硅薄 銆hMutex = CreateMutex(NULL, FALSE, NULL); 銆// 鍚姩綰跨▼ 銆AfxBeginThread(ThreadProc18, NULL); 銆AfxBeginThread(ThreadProc19, NULL); 銆// 絳夊緟璁$畻瀹屾瘯 銆Sleep(300); 銆// 鎶ュ憡璁$畻緇撴灉 銆CString sResult = CString(g_cArray); 銆AfxMessageBox(sResult); }
銆銆浜掓枼瀵硅薄鍦∕FC涓氳繃CMutex綾昏繘琛岃〃榪般備嬌鐢–Mutex綾葷殑鏂規硶闈炲父綆鍗曪紝鍦ㄦ瀯閫燙Mutex綾誨璞$殑鍚屾椂鍙互鎸囨槑寰呮煡璇㈢殑浜掓枼瀵硅薄鐨勫悕瀛楋紝鍦ㄦ瀯閫犲嚱鏁拌繑鍥炲悗鍗沖彲璁塊棶姝や簰鏂ュ彉閲忋侰Mutex綾諱篃鏄彧鍚湁鏋勯犲嚱鏁拌繖鍞竴鐨勬垚鍛樺嚱鏁幫紝褰撳畬鎴愬浜掓枼瀵硅薄淇濇姢璧勬簮鐨勮闂悗錛屽彲閫氳繃璋冪敤浠庣埗綾籆SyncObject緇ф壙鐨刄nLock錛堬級鍑芥暟瀹屾垚瀵逛簰鏂ュ璞$殑閲婃斁銆侰Mutex綾繪瀯閫犲嚱鏁板師鍨嬩負錛?br>
CMutex( BOOL bInitiallyOwn = FALSE, LPCTSTR lpszName = NULL, LPSECURITY_ATTRIBUTES lpsaAttribute = NULL );
銆銆璇ョ被鐨勯傜敤鑼冨洿鍜屽疄鐜板師鐞嗕笌API鏂瑰紡鍒涘緩鐨勪簰鏂ュ唴鏍稿璞℃槸瀹屽叏綾諱技鐨勶紝浣嗚綆媧佺殑澶氾紝涓嬮潰緇欏嚭灝辨槸瀵瑰墠闈㈢殑紺轟緥浠g爜緇廋Mutex綾繪敼鍐欏悗鐨勭▼搴忓疄鐜版竻鍗曪細
// MFC浜掓枼綾誨璞?br>CMutex g_clsMutex(FALSE, NULL); UINT ThreadProc27(LPVOID pParam) { 銆// 絳夊緟浜掓枼瀵硅薄閫氱煡 銆g_clsMutex.Lock(); 銆// 瀵瑰叡浜祫婧愯繘琛屽啓鍏ユ搷浣?br>銆for (int i = 0; i < 10; i++) 銆{ 銆銆g_cArray[i] = 'a'; 銆銆Sleep(1); 銆} 銆// 閲婃斁浜掓枼瀵硅薄 銆g_clsMutex.Unlock(); 銆return 0; } UINT ThreadProc28(LPVOID pParam) { 銆// 絳夊緟浜掓枼瀵硅薄閫氱煡 銆g_clsMutex.Lock(); 銆// 瀵瑰叡浜祫婧愯繘琛屽啓鍏ユ搷浣?br>銆for (int i = 0; i < 10; i++) 銆{ 銆銆g_cArray[10 - i - 1] = 'b'; 銆銆Sleep(1); 銆} 銆// 閲婃斁浜掓枼瀵硅薄 銆g_clsMutex.Unlock(); 銆return 0; } …… void CSample08View::OnMutexMfc() { 銆// 鍚姩綰跨▼ 銆AfxBeginThread(ThreadProc27, NULL); 銆AfxBeginThread(ThreadProc28, NULL); 銆// 絳夊緟璁$畻瀹屾瘯 銆Sleep(300); 銆// 鎶ュ憡璁$畻緇撴灉 銆CString sResult = CString(g_cArray); 銆AfxMessageBox(sResult); }
銆銆灝忕粨 銆銆綰跨▼鐨勪嬌鐢ㄤ嬌紼嬪簭澶勭悊鏇村鏇村姞鐏墊椿錛岃岃繖縐嶇伒媧誨悓鏍蜂篃浼氬甫鏉ュ悇縐嶄笉紜畾鎬х殑鍙兘銆傚挨鍏舵槸鍦ㄥ涓嚎紼嬪鍚屼竴鍏叡鍙橀噺榪涜璁塊棶鏃躲傝櫧鐒舵湭浣跨敤綰跨▼鍚屾鐨勭▼搴忎唬鐮佸湪閫昏緫涓婃垨璁告病鏈変粈涔堥棶棰橈紝浣嗕負浜嗙‘淇濈▼搴忕殑姝g‘銆佸彲闈犺繍琛岋紝蹇呴』鍦ㄩ傚綋鐨勫満鍚堥噰鍙栫嚎紼嬪悓姝ユ帾鏂姐?/strong>
]]> 青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
国产日韩在线看 |
久久午夜激情 |
国产精品久久久久9999吃药 |
日韩视频在线观看免费 |
亚洲欧美久久久久一区二区三区 |
欧美日韩日日骚 |
另类人畜视频在线 |
欧美一级日韩一级 |
久久精品国产99 |
性色一区二区 |
欧美国产大片 |
国产午夜精品麻豆 |
国产精品―色哟哟 |
国产真实乱偷精品视频免 |
国产精品资源 |
国产人久久人人人人爽 |
激情五月婷婷综合 |
韩国成人福利片在线播放 |
亚洲二区在线观看 |
亚洲精品国产精品久久清纯直播 |
亚洲精美视频 |
欧美一区二区三区在线 |
久久精品一区二区三区四区
|
亚洲日本一区二区三区 |
亚洲高清自拍 |
亚洲免费中文 |
久久亚洲一区二区 |
久久精品99国产精品酒店日本 |
蜜臀91精品一区二区三区 |
免费成人黄色 |
亚洲一区二区在线看 |
亚洲欧美中文日韩v在线观看 |
性久久久久久久 |
欧美日本精品 |
国产偷久久久精品专区 |
99视频国产精品免费观看 |
亚洲影院色无极综合 |
99在线热播精品免费 |
久久av一区二区三区 |
欧美+日本+国产+在线a∨观看 |
99视频精品免费观看 |
亚洲欧美国产不卡 |
麻豆精品在线视频 |
国内外成人免费激情在线视频 |
亚洲国产欧美精品 |
亚洲性感激情 |
欧美岛国在线观看 |
亚洲精品在线视频 |
久久一二三国产 |
国产精品欧美久久 |
亚洲婷婷综合久久一本伊一区 |
久久久噜噜噜久久狠狠50岁 |
欧美成人一区在线 |
久久精品91久久香蕉加勒比 |
欧美精品www |
亚洲欧洲午夜 |
久久久蜜臀国产一区二区 |
久久亚洲欧美国产精品乐播 |
久久久久久69 |
欧美亚洲日本网站 |
久久综合国产精品 |
亚洲国产你懂的 |
欧美国产亚洲视频 |
亚洲视频精品 |
欧美成人资源 |
99精品视频免费全部在线 |
久久免费观看视频 |
久久se精品一区精品二区 |
欧美日韩中文字幕在线视频 |
亚洲高清不卡在线 |
亚洲第一综合天堂另类专 |
欧美一激情一区二区三区 |
国产精品午夜视频 |
亚洲影视在线播放 |
亚洲图片欧洲图片日韩av |
欧美激情视频给我 |
在线日韩中文 |
91久久极品少妇xxxxⅹ软件 |
久久久久九九九 |
亚洲国产精品尤物yw在线观看 |
久久亚洲综合色一区二区三区 |
亚洲福利视频专区 |
嫩草影视亚洲 |
亚洲精品一级 |
久久精品视频亚洲 |
欧美在线91 |
黄色成人av在线 |
亚洲性人人天天夜夜摸 |
99亚洲伊人久久精品影院红桃 |
欧美女主播在线 |
午夜精品久久久 |
亚洲一区亚洲二区 |
精东粉嫩av免费一区二区三区 |
久久青青草综合 |
久久久久久久久久久久久女国产乱
|
亚洲欧美日韩久久精品 |
欧美在线观看一区 |
国产综合久久久久影院 |
欧美韩日精品 |
欧美精品手机在线 |
亚洲自拍偷拍网址 |
久久嫩草精品久久久精品一 |
1769国产精品 |
一区二区三区视频在线 |
99精品热视频 |
在线精品福利 |
91久久中文 |
国产精品v欧美精品v日韩精品 |
久久这里有精品15一区二区三区 |
久久久午夜精品 |
久久成人精品 |
欧美精品免费播放 |
亚洲欧美国内爽妇网 |
久久夜色精品亚洲噜噜国产mv |
日韩午夜精品 |
亚洲欧美区自拍先锋 |
亚洲精品日本 |
欧美一区二区三区在线视频 |
亚洲美女精品一区 |
亚洲欧美日韩国产另类专区 |
亚洲激情综合 |
亚洲欧美日韩另类 |
国产视频不卡 |
亚洲乱码精品一二三四区日韩在线 |
国产精品日产欧美久久久久 |
老司机成人网 |
国产精品美女一区二区 |
99视频在线观看一区三区 |
国产主播精品 |
性亚洲最疯狂xxxx高清 |
9l国产精品久久久久麻豆 |
亚洲线精品一区二区三区八戒 |
亚洲精品久久久久久下一站
|
久久久久在线 |
国产一区二区三区成人欧美日韩在线观看 |
欧美xx视频 |
一区在线视频观看 |
亚洲午夜久久久久久久久电影院 |
欧美午夜不卡影院在线观看完整版免费 |
裸体一区二区 |
国产毛片一区 |
亚洲欧美日韩综合一区 |
aa级大片欧美三级 |
欧美日韩国产免费 |
欧美二区在线 |
麻豆freexxxx性91精品 |
久久综合成人精品亚洲另类欧美
|
美女精品自拍一二三四 |
欧美大片在线观看一区 |
国产综合香蕉五月婷在线 |
欧美尤物巨大精品爽 |
欧美亚洲在线观看 |
国产亚洲精品久久久久动 |
一区二区欧美国产 |
黄色国产精品 |
欧美成人精品激情在线观看 |
久久久久久夜 |
亚洲日本无吗高清不卡 |
欧美成人xxx |
日韩视频在线一区二区 |
久久男人资源视频 |
亚洲精品之草原avav久久 |
亚洲久久一区 |
欧美精品网站 |
亚洲欧美韩国 |
欧美在线精品一区 |
亚洲第一色在线 |
欧美91福利在线观看 |
亚洲精品一区二区三区av |
日韩视频在线一区二区三区 |
国产精品久久久久久久7电影 |
亚洲图色在线 |
亚洲少妇中出一区 |
久久偷窥视频 |
亚洲精品影院在线观看 |
欧美日韩中文字幕综合视频 |
亚洲激情小视频 |
91久久一区二区 |
欧美日韩综合在线 |
欧美激情一区二区在线 |
午夜综合激情 |
精品999久久久 |
国产精品扒开腿做爽爽爽软件 |
一本一本久久 |
欧美国产三区 |
亚洲视频网在线直播 |
一区久久精品 |
欧美日本高清一区 |
久久久久88色偷偷免费 |
欧美国产精品人人做人人爱 |
亚洲日本激情 |
永久域名在线精品 |
欧美日韩一区二区三区四区五区
|
欧美制服丝袜 |
亚洲电影第三页 |
蜜月aⅴ免费一区二区三区
|
欧美一区二区在线播放 |
性久久久久久 |
亚洲国产另类久久久精品极度 |
夜夜精品视频一区二区 |