• <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>
            春暖花開
            雪化了,花開了,春天來了
            posts - 149,comments - 125,trackbacks - 0
            進(jìn)程的互斥運(yùn)行
            http://bbs.onlycpp.net/viewthread.php?tid=540&extra=page%3D1

              正常情況下,一個(gè)進(jìn)程的運(yùn)行一般是不會(huì)影響到其他正在運(yùn)行的進(jìn)程的。但是對于某些有特殊要求的如以獨(dú)占方式使用串行口等硬件設(shè)備的程序就要求在其進(jìn)程運(yùn)行期間不允許其他試圖使用此端口設(shè)備的程序運(yùn)行的,而且此類程序通常也不允許運(yùn)行同一個(gè)程序的多個(gè)實(shí)例。這就引出了進(jìn)程互斥的問題。

              實(shí)現(xiàn)進(jìn)程互斥的核心思想比較簡單:進(jìn)程在啟動(dòng)時(shí)首先檢查當(dāng)前系統(tǒng)是否已經(jīng)存在有此進(jìn)程的實(shí)例,如果沒有,進(jìn)程將成功創(chuàng)建并設(shè)置標(biāo)識(shí)實(shí)例已經(jīng)存在的標(biāo)記。此后再創(chuàng)建進(jìn)程時(shí)將會(huì)通過該標(biāo)記而知曉其實(shí)例已經(jīng)存在,從而保證進(jìn)程在系統(tǒng)中只能存在一個(gè)實(shí)例。具體可以采取內(nèi)存映射文件、有名事件量、有名互斥量以及全局共享變量等多種方法來實(shí)現(xiàn)。下面就分別對其中具有代表性的有名互斥量和全局共享變量這兩種方法進(jìn)行介紹:
            // 創(chuàng)建互斥量
            HANDLE m_hMutex = CreateMutex(NULL, FALSE, "Sample07");
            // 檢查錯(cuò)誤代碼
            if (GetLastError() == ERROR_ALREADY_EXISTS) {
             // 如果已有互斥量存在則釋放句柄并復(fù)位互斥量
             CloseHandle(m_hMutex);
             m_hMutex = NULL;
             // 程序退出
             return FALSE;
            }

              上面這段代碼演示了有名互斥量在進(jìn)程互斥中的用法。代碼的核心是CreateMutex()對有名互斥量的創(chuàng)建。CreateMutex()函數(shù)可用來創(chuàng)建一個(gè)有名或無名的互斥量對象,其函數(shù)原型為:
            HANDLE CreateMutex(
             LPSECURITY_ATTRIBUTES lpMutexAttributes, // 指向安全屬性的指針
             BOOL bInitialOwner, // 初始化互斥對象的所有者
             LPCTSTR lpName // 指向互斥對象名的指針
            );

              如果函數(shù)成功執(zhí)行,將返回一個(gè)互斥量對象的句柄。如果在CreateMutex()執(zhí)行前已經(jīng)存在有相同名字的互斥量,函數(shù)將返回這個(gè)已經(jīng)存在互斥量的句柄,并且可以通過GetLastError()得到錯(cuò)誤代碼ERROR_ALREADY_EXIST。可見,通過對錯(cuò)誤代碼ERROR_ALREADY_EXIST的檢測可以實(shí)現(xiàn)CreateMutex()對進(jìn)程的互斥。
                    建立互斥體,用來同步。如果一個(gè)線程獲取了互斥體,則要獲取該互斥體的第二個(gè)線程將被掛起,直到第一個(gè)線程釋放該互斥體。

            參數(shù)
            lpMutexAttributes
            指向一個(gè)SECURITY_ATTRIBUTES結(jié)構(gòu)的指針,這個(gè)結(jié)構(gòu)決定互斥體句柄是否被子進(jìn)程繼承。     
            bInitialOwner
            布爾類型,決定互斥體的創(chuàng)建者是否為擁有者
            lpName
            指向互斥體名字字符串的指針。互斥體可以有名字。
            互斥體的好處是可以在進(jìn)程間共享
            心得體會(huì):
                CreateMutex() 用于有獨(dú)占要求的程序 (在其進(jìn)程運(yùn)行期間不允許其他使用此端口設(shè)備的程序運(yùn)行,或不允許同名程序運(yùn)行)。如有同名程序運(yùn)行,則通過 GetLastError()得到錯(cuò)誤代碼 ERROR_ALREADY_EXIST

            剛才又執(zhí)行了下得出的結(jié)果(程序名samp)
                   一般情況下:一進(jìn)入調(diào)試階段,進(jìn)程管理器中就出現(xiàn)了samp進(jìn)程,執(zhí)行到CreateMutex時(shí)返回進(jìn)程句柄,執(zhí)行到if(GetLastError() == ERROR_ALREADY_EXISTS ) 進(jìn)行判斷時(shí),跳過不執(zhí)行if中的內(nèi)容,所以表示沒有互斥。
                   調(diào)試之前先運(yùn)行debug中的samp.exe再調(diào)試:一進(jìn)入調(diào)試階段,進(jìn)程管理器中就出現(xiàn)了兩個(gè)samp進(jìn)程,執(zhí)行到CreateMutex時(shí)返回進(jìn)程句柄,執(zhí)行到if(GetLastError() == ERROR_ALREADY_EXISTS ) 進(jìn)行判斷時(shí),執(zhí)行if中的內(nèi)容,表示有互斥。
            posted on 2008-12-26 18:46 Sandy 閱讀(647) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++
            亚洲国产成人久久综合一| 国产A级毛片久久久精品毛片| 久久亚洲精品成人av无码网站| 免费一级欧美大片久久网| 久久午夜无码鲁丝片秋霞| 国产精品久久久久9999高清| 天天久久狠狠色综合| 久久久久国产一区二区| 青草国产精品久久久久久| 久久这里只精品国产99热| 久久亚洲高清综合| 久久久久人妻精品一区| 午夜视频久久久久一区 | 综合久久精品色| 久久夜色精品国产噜噜麻豆| 久久精品一区二区三区不卡| 欧美成人免费观看久久| 久久国产热精品波多野结衣AV| 欧美精品一区二区久久| 久久精品一本到99热免费| 亚洲精品国产综合久久一线| 国产精品无码久久久久久| 一级a性色生活片久久无| 久久精品国产69国产精品亚洲| 国产美女亚洲精品久久久综合 | 久久精品国产亚洲av高清漫画| 久久久99精品成人片中文字幕 | 久久久久久国产精品无码下载| 一级做a爰片久久毛片人呢| 日韩久久久久久中文人妻 | 久久精品成人影院| 久久狠狠色狠狠色综合| 国产一区二区三区久久| 亚洲第一极品精品无码久久| 香蕉久久久久久狠狠色| 久久午夜综合久久| 欧美与黑人午夜性猛交久久久| 国产亚州精品女人久久久久久| 欧美日韩中文字幕久久伊人| 99久久成人18免费网站| 国产—久久香蕉国产线看观看|