天天看點

線程同步的三種方式(Mutex,Event,Critical Section)

線程同步的三種方式:

互斥對象

事件對象

關鍵代碼段

三者的比較:

n       互斥對象和事件對象屬于核心對象,利用核心對象進行線程同步,速度較慢,但利用互斥對象和事件對象這樣的核心對象,可以在多個程序中的各個線程間進行同步。

n       關鍵代碼段是工作在使用者方式下,同步速度較快,但在使用關鍵代碼段時,很容易進入死鎖狀态,因為在等待進入關鍵代碼段時無法設定逾時值。

互斥對象:

HANDLE hMutex;                //全局變量

hMutex=CreateMutex(NULL,TRUE,NULL);

ReleaseMutex(hMutex);

       //在其他的線程中

       WaitForSingleObject(hMutex,INFINITE);

       需要同步的,通路共享資源的程式代碼

       ReleaseMutex(hMutex);

CloseHandle(g_hEvent);

事件對象:

              HANDLE g_hEvent;                    //全局變量

              g_hEvent=CreateEvent(NULL,FALSE,FALSE,"tickets");

              SetEvent(g_hEvent);

                     WaitForSingleObject(g_hEvent,INFINITE);

                     需要同步的,通路共享資源的程式代碼

                     SetEvent(g_hEvent);      //置事件為有信号狀态(其他線程可以通路)

                                                        //ResetEvent(g_hEvent)

//置事件為無信.//号狀态(其他線程不可通路,隻在該//線程内有效)

              CloseHandle(g_hEvent);

關鍵代碼段:

              CRITICAL_SECTION g_cs;               //全局變量

              InitializeCriticalSection(&g_cs);           //通常在類的構造函數中

                     EnterCriticalSection(&g_cs);

需要同步的,通路共享資源的程式代碼

LeaveCriticalSection(&g_cs);

DeleteCriticalSection(&g_cs);              //通常在類的析構函數中

專注于企業資訊化,最近對股票資料分析較為感興趣,可免費分享股票個股主力資金實時變化趨勢分析工具,股票交流QQ群:457394862

本文轉自滄海-重慶部落格園部落格,原文連結:http://www.cnblogs.com/omygod/archive/2006/11/08/554519.html,如需轉載請自行聯系原作者

繼續閱讀