锘??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美激情第六页,亚洲欧美在线看,亚洲国产一区二区三区a毛片http://m.shnenglu.com/tdweng/category/15115.htmlzh-cnFri, 17 Dec 2010 05:28:29 GMTFri, 17 Dec 2010 05:28:29 GMT60InterLockedIncrement and InterLockedDecrementhttp://m.shnenglu.com/tdweng/articles/136461.html蹇冪窘蹇冪窘Wed, 15 Dec 2010 01:55:00 GMThttp://m.shnenglu.com/tdweng/articles/136461.htmlhttp://m.shnenglu.com/tdweng/comments/136461.htmlhttp://m.shnenglu.com/tdweng/articles/136461.html#Feedback0http://m.shnenglu.com/tdweng/comments/commentRss/136461.htmlhttp://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

蹇冪窘 2010-12-15 09:55 鍙戣〃璇勮
]]>
銆愯漿銆戜竴涓畝鍗曠殑綰跨▼姹狅紙c++鐗堬級 http://m.shnenglu.com/tdweng/articles/129161.html蹇冪窘蹇冪窘Sat, 09 Oct 2010 01:42:00 GMThttp://m.shnenglu.com/tdweng/articles/129161.htmlhttp://m.shnenglu.com/tdweng/comments/129161.htmlhttp://m.shnenglu.com/tdweng/articles/129161.html#Feedback0http://m.shnenglu.com/tdweng/comments/commentRss/129161.htmlhttp://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);


蹇冪窘 2010-10-09 09:42 鍙戣〃璇勮
]]>
Visual C++綰跨▼鍚屾鎶鏈?杞?http://m.shnenglu.com/tdweng/articles/124796.html蹇冪窘蹇冪窘Thu, 26 Aug 2010 03:38:00 GMThttp://m.shnenglu.com/tdweng/articles/124796.htmlhttp://m.shnenglu.com/tdweng/comments/124796.htmlhttp://m.shnenglu.com/tdweng/articles/124796.html#Feedback0http://m.shnenglu.com/tdweng/comments/commentRss/124796.htmlhttp://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>
thread01.jpg
鍥? 浣跨敤涓寸晫鍖轟繚鎸佺嚎紼嬪悓姝?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>
Thread02.jpg
鍥? 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>
thread03.jpg
鍥? 浣跨敤淇″彿閲忓璞℃帶鍒惰祫婧?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);
}

thread04.jpg
鍥? 寮濮嬭繘鍏ョ殑涓や釜綰跨▼

thread05.jpg
鍥? 綰跨▼浜岄鍑哄悗綰跨▼涓夋墠寰椾互榪涘叆

銆銆涓婅堪浠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>
thread06.jpg
鍥? 浣跨敤浜掓枼鍐呮牳瀵硅薄瀵瑰叡浜祫婧愮殑淇濇姢

銆銆鍥撅紙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>



蹇冪窘 2010-08-26 11:38 鍙戣〃璇勮
]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              国产日韩在线看| 久久午夜激情| 国产精品久久久久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ⅴ免费一区二区三区 | 欧美一区二区在线播放| 性久久久久久| 亚洲国产另类久久久精品极度| 夜夜精品视频一区二区|