• <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
            進程的互斥運行
            http://bbs.onlycpp.net/viewthread.php?tid=540&extra=page%3D1

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

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

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

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

            參數
            lpMutexAttributes
            指向一個SECURITY_ATTRIBUTES結構的指針,這個結構決定互斥體句柄是否被子進程繼承。     
            bInitialOwner
            布爾類型,決定互斥體的創建者是否為擁有者
            lpName
            指向互斥體名字字符串的指針?;コ怏w可以有名字。
            互斥體的好處是可以在進程間共享
            心得體會:
                CreateMutex() 用于有獨占要求的程序 (在其進程運行期間不允許其他使用此端口設備的程序運行,或不允許同名程序運行)。如有同名程序運行,則通過 GetLastError()得到錯誤代碼 ERROR_ALREADY_EXIST。

            剛才又執行了下得出的結果(程序名samp)
                   一般情況下:一進入調試階段,進程管理器中就出現了samp進程,執行到CreateMutex時返回進程句柄,執行到if(GetLastError() == ERROR_ALREADY_EXISTS ) 進行判斷時,跳過不執行if中的內容,所以表示沒有互斥。
                   調試之前先運行debug中的samp.exe再調試:一進入調試階段,進程管理器中就出現了兩個samp進程,執行到CreateMutex時返回進程句柄,執行到if(GetLastError() == ERROR_ALREADY_EXISTS ) 進行判斷時,執行if中的內容,表示有互斥。
            posted on 2008-12-26 18:46 Sandy 閱讀(656) 評論(0)  編輯 收藏 引用 所屬分類: C++
            精品蜜臀久久久久99网站| 久久久精品人妻无码专区不卡 | 伊人久久大香线蕉亚洲| 久久精品国产色蜜蜜麻豆| 久久精品亚洲一区二区三区浴池| 青草影院天堂男人久久| 久久精品中文字幕第23页| 久久亚洲欧美国产精品 | 久久人人爽人人爽人人片av高请| 精品久久久久久中文字幕人妻最新 | 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 久久亚洲综合色一区二区三区| 久久性生大片免费观看性| 青草国产精品久久久久久| 久久久WWW成人免费精品| 久久久久人妻一区精品色| 久久夜色精品国产亚洲av| 国产Av激情久久无码天堂| 东方aⅴ免费观看久久av| 午夜视频久久久久一区 | 性高朝久久久久久久久久| 久久99国产精品久久99| 久久国产精品无码HDAV| 国产精品亚洲综合久久| 色天使久久综合网天天| 很黄很污的网站久久mimi色| 99精品国产在热久久| 亚洲愉拍99热成人精品热久久| 亚洲乱码日产精品a级毛片久久| 777久久精品一区二区三区无码 | 久久久亚洲欧洲日产国码aⅴ| 久久综合色区| 婷婷久久综合九色综合绿巨人| 国产巨作麻豆欧美亚洲综合久久| 99久久人妻无码精品系列蜜桃| 久久精品国产亚洲av水果派| 久久亚洲AV无码精品色午夜麻豆 | 四虎影视久久久免费| 久久久久婷婷| 国产精品久久久久久久人人看| 国内精品久久国产|