• <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>
            臨界區(qū)

              定義臨界區(qū)變量

            CRITICAL_SECTION gCriticalSection;

              通常情況下,CRITICAL_SECTION結(jié)構(gòu)體應(yīng)該被定義為全局變量,以便于進程中的所有線程方便地按照變量名來引用該結(jié)構(gòu)體。

              初始化臨界區(qū)

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

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

              刪除臨界區(qū)

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

              進入臨界區(qū)

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

              離開臨界區(qū)

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

              使用臨界區(qū)編程的一般方法是:

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

              關(guān)于臨界區(qū)的使用,有下列注意點:

              (1)每個共享資源使用一個CRITICAL_SECTION變量;

              (2)不要長時間運行關(guān)鍵代碼段,當一個關(guān)鍵代碼段長時間運行時,其他線程就會進入等待狀態(tài),這會降低應(yīng)用程序的運行性能;

              (3)如果需要同時訪問多個資源,則可能連續(xù)調(diào)用EnterCriticalSection;

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

              互斥

              互斥量的作用是保證每次只能有一個線程獲得互斥量而得以繼續(xù)執(zhí)行,使用CreateMutex函數(shù)創(chuàng)建:

            HANDLE CreateMutex(
             LPSECURITY_ATTRIBUTES lpMutexAttributes,
             // 安全屬性結(jié)構(gòu)指針,可為NULL
             BOOL bInitialOwner,
             //是否占有該互斥量,TRUE:占有,F(xiàn)ALSE:不占有
             LPCTSTR lpName
             //信號量的名稱
            );

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

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

            else{
             …
            }

              相關(guān)API:

            BOOL WINAPI ReleaseMutex(
             HANDLE hMutex
            );

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

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

              互斥(mutex)內(nèi)核對象能夠確保線程擁有對單個資源的互斥訪問權(quán)。互斥對象的行為特性與臨界區(qū)相同,但是互斥對象屬于內(nèi)核對象,而臨界區(qū)則屬于用戶方式對象,因此這導(dǎo)致mutex與Critical Section的如下不同:

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

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

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

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


            Posted on 2005-12-30 18:50 艾凡赫 閱讀(911) 評論(0)  編輯 收藏 引用 所屬分類: 多線程
            国内精品久久久久影院优| 国产韩国精品一区二区三区久久 | 国产精品99久久久久久宅男小说| 国产精品无码久久久久| 青草久久久国产线免观| 欧美噜噜久久久XXX| 精品熟女少妇aⅴ免费久久| 久久久久久曰本AV免费免费| 久久99精品综合国产首页| 久久本道综合久久伊人| 少妇人妻88久久中文字幕| 国产午夜精品久久久久九九| 色婷婷综合久久久久中文| 三级片免费观看久久| 国产精品久久久久9999| 亚洲欧美日韩中文久久 | 2021国内精品久久久久久影院| 99久久人妻无码精品系列蜜桃| 日韩欧美亚洲综合久久影院Ds| 国产精品久久久久影视不卡| 精品综合久久久久久98| 一本一本久久a久久精品综合麻豆| 国产成人精品久久一区二区三区 | 青青青青久久精品国产| 久久综合给久久狠狠97色 | 四虎国产精品成人免费久久| 国产无套内射久久久国产| 精品久久久久久久久久中文字幕 | 久久艹国产| 国产精品久久久久乳精品爆| 久久福利青草精品资源站免费| 久久99精品国产自在现线小黄鸭| 国产激情久久久久久熟女老人 | 久久国产免费| 久久精品国产清自在天天线| 国产成人香蕉久久久久| 99久久精品久久久久久清纯| 精品久久久久中文字幕一区| 深夜久久AAAAA级毛片免费看| 亚洲欧洲精品成人久久曰影片 | 国产精品久久久久9999高清|