• <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>
            臨界區

              定義臨界區變量

            CRITICAL_SECTION gCriticalSection;

              通常情況下,CRITICAL_SECTION結構體應該被定義為全局變量,以便于進程中的所有線程方便地按照變量名來引用該結構體。

              初始化臨界區

            VOID WINAPI InitializeCriticalSection(
             LPCRITICAL_SECTION lpCriticalSection
             //指向程序員定義的CRITICAL_SECTION變量
            );

              該函數用于對pcs所指的CRITICAL_SECTION結構體進行初始化。該函數只是設置了一些成員變量,它的運行一般不會失敗,因此它采用了VOID類型的返回值。該函數必須在任何線程調用EnterCriticalSection函數之前被調用,如果一個線程試圖進入一個未初始化的CRTICAL_SECTION,那么結果將是很難預計的。

              刪除臨界區

            VOID WINAPI DeleteCriticalSection(
             LPCRITICAL_SECTION lpCriticalSection
             //指向一個不再需要的CRITICAL_SECTION變量
            );

              進入臨界區

            VOID WINAPI EnterCriticalSection(
             LPCRITICAL_SECTION lpCriticalSection
             //指向一個你即將鎖定的CRITICAL_SECTION變量
            );

              離開臨界區

            VOID WINAPI LeaveCriticalSection(
             LPCRITICAL_SECTION lpCriticalSection
             //指向一個你即將離開的CRITICAL_SECTION變量
            );

              使用臨界區編程的一般方法是:

            void UpdateData()
            {
             EnterCriticalSection(&gCriticalSection);
             ...//do something
             LeaveCriticalSection(&gCriticalSection);
            }

              關于臨界區的使用,有下列注意點:

             ?。?)每個共享資源使用一個CRITICAL_SECTION變量;

             ?。?)不要長時間運行關鍵代碼段,當一個關鍵代碼段長時間運行時,其他線程就會進入等待狀態,這會降低應用程序的運行性能;

             ?。?)如果需要同時訪問多個資源,則可能連續調用EnterCriticalSection;

             ?。?)Critical Section不是OS核心對象,如果進入臨界區的線程"掛"了,將無法釋放臨界資源。這個缺點在Mutex中得到了彌補。

              互斥

              互斥量的作用是保證每次只能有一個線程獲得互斥量而得以繼續執行,使用CreateMutex函數創建:

            HANDLE CreateMutex(
             LPSECURITY_ATTRIBUTES lpMutexAttributes,
             // 安全屬性結構指針,可為NULL
             BOOL bInitialOwner,
             //是否占有該互斥量,TRUE:占有,FALSE:不占有
             LPCTSTR lpName
             //信號量的名稱
            );

              Mutex是核心對象,可以跨進程訪問,下面的代碼給出了從另一進程訪問命名Mutex的例子:

            HANDLE hMutex;
            hMutex = OpenMutex(MUTEX_ALL_Access, FALSE, L"mutexName");
            if (hMutex){
             …

            else{
             …
            }

              相關API:

            BOOL WINAPI ReleaseMutex(
             HANDLE hMutex
            );

              使用互斥編程的一般方法是:

            void UpdateResource()
            {
             WaitForSingleObject(hMutex,…);
             ...//do something
             ReleaseMutex(hMutex);
            }

              互斥(mutex)內核對象能夠確保線程擁有對單個資源的互斥訪問權?;コ鈱ο蟮男袨樘匦耘c臨界區相同,但是互斥對象屬于內核對象,而臨界區則屬于用戶方式對象,因此這導致mutex與Critical Section的如下不同:

              (1) 互斥對象的運行速度比關鍵代碼段要慢;

             ?。?) 不同進程中的多個線程能夠訪問單個互斥對象;

             ?。?) 線程在等待訪問資源時可以設定一個超時值。

              下圖更詳細地列出了互斥與臨界區的不同:


            Posted on 2005-12-30 18:50 艾凡赫 閱讀(900) 評論(0)  編輯 收藏 引用 所屬分類: 多線程
            久久精品国产精品亚洲精品| 久久精品无码专区免费东京热| 久久精品国产亚洲AV大全| 久久天天躁狠狠躁夜夜2020一 | 国产午夜精品理论片久久 | 国内精品久久国产| 狠狠狠色丁香婷婷综合久久五月 | 国产成人久久精品二区三区| 精品国产日韩久久亚洲 | 国产成人久久777777| 中文成人无码精品久久久不卡| 77777亚洲午夜久久多喷| 亚洲精品午夜国产va久久| 九九久久99综合一区二区| 欧美亚洲另类久久综合婷婷| 久久Av无码精品人妻系列 | 日日噜噜夜夜狠狠久久丁香五月| 久久无码一区二区三区少妇| 久久综合九色综合久99| 波多野结衣中文字幕久久| 免费一级欧美大片久久网| 久久精品国产99国产精偷| 久久丫忘忧草产品| 久久久久亚洲?V成人无码| 99久久99久久精品国产片果冻| 国产精品久久久久久久app| 国产ww久久久久久久久久| 久久99热只有频精品8| 久久精品一区二区三区AV| 污污内射久久一区二区欧美日韩| 精品久久久久久国产牛牛app| 国产成人精品久久二区二区| 久久久久亚洲av无码专区 | 成人国内精品久久久久一区| 国产美女亚洲精品久久久综合 | 久久久久亚洲av成人无码电影| 国产美女久久久| 久久精品国产影库免费看| 亚洲国产二区三区久久| 99久久精品免费| 久久99精品久久久久久野外|