多線程的那點兒事(之C++鎖)

來源:互聯網
上載者:User

【 聲明:著作權,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】

  

    編寫程式不容易,編寫多線程的程式更不容易。相信編寫過多線程的程式都應該有這樣的一個痛苦過程,什麼樣的情況呢?朋友們應該看一下代碼就明白了,

void data_process(){    EnterCriticalSection();      if(/* error happens */)    {        LeaveCriticalSection();        return;    }    if(/* other error happens */)    {        return;    }    LeaveCriticalSection();}

    上面的代碼說明了一種情形。這種多線程的互斥情況在代碼編寫過程中是經常遇到的。所以,每次對共用資料進行操作時,都需要對資料進行EnterCriticalSection和LeaveCriticalSection的操作。但是,這中間也不是一帆風順的。很有可能你會遇到各種各樣的錯誤。那麼,這時候你的程式就需要跳出去了。可能一開始遇到error的時候,你還記得需要退出臨界區。但是,如果錯誤多了,你未必記得還有這個操作了。這一錯就完了,別的線程就沒有機會擷取這個鎖了。
    那麼,有沒有可能利用C++的特性,自動處理這種情況呢?還真有。我們看看下面這個代碼,

class CLock{    CRITICAL_SECTION& cs;public:    CLock(CRITICAL_SECTION& lock):cs(lock){        EnterCriticalSection(&cs);    }    ~CLock() {        LeaveCriticalSection(&cs);    }}class Process{    CRITICAL_SECTION cs;    /* other data */public:    Process(){        InitializeCriticalSection(&cs);    }    ~Process() {DeleteCriticalSection(&cs);}    void data_process(){        CLock lock(cs);        if(/* error happens */){            return;        }        return;    }}

    C++的一個重要特點就是,不管函數什麼時候退出,系統都會自動調用類的解構函式。在Process類的data_process函數中,,函數在開始就建立了一個CLock類。那麼,在建立這個類的時候,其實就開始了臨界區的pk。那麼一旦進入到臨界區當中,在error中能不能及時退出臨界區呢?此時,c++解構函式的優勢出現了。因為不管錯誤什麼時候出現,在函數退出之前,系統都會幫我們善後。什麼善後呢?就是系統會調用CLock的解構函式,也就是退出臨界區。這樣,我們的目的就達到了。
    其實,這就是一個c++的trick。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.