http://www.cppblog.com/finehai/archive/2014/03/13/90745.html
進(jìn)程的互斥運行
正常情況下问芬,一個進(jìn)程的運行一般是不會影響到其他正在運行的進(jìn)程的按灶。但是對于某些有特殊要求的如以獨占方式使用串行口等硬件設(shè)備的程序就要求在其進(jìn)程運行期間不允許其他試圖使用此端口設(shè)備的程序運行的例隆,而且此類程序通常也不允許運行同一個程序的多個實例。這就引出了進(jìn)程互斥的問題邮绿。
實現(xiàn)進(jìn)程互斥的核心思想比較簡單:進(jìn)程在啟動時首先檢查當(dāng)前系統(tǒng)是否已經(jīng)存在有此進(jìn)程的實例渠旁,如果沒有攀例,進(jìn)程將成功創(chuàng)建并設(shè)置標(biāo)識實例已經(jīng)存在的標(biāo)記船逮。此后再創(chuàng)建進(jìn)程時將會通過該標(biāo)記而知曉其實例已經(jīng)存在,從而保證進(jìn)程在系統(tǒng)中只能存在一個實例粤铭。具體可以采取內(nèi)存映射文件挖胃、有名事件量、有名互斥量以及全局共享變量等多種方法來實現(xiàn)。下面就分別對其中具有代表性的有名互斥量和全局共享變量這兩種方法進(jìn)行介紹:
上面這段代碼演示了有名互斥量在進(jìn)程互斥中的用法酱鸭。代碼的核心是CreateMutex()對有名互斥量的創(chuàng)建吗垮。CreateMutex()函數(shù)可用來創(chuàng)建一個有名或無名的互斥量對象,其函數(shù)原型為:
如果函數(shù)成功執(zhí)行凹髓,將返回一個互斥量對象的句柄烁登。如果在CreateMutex()執(zhí)行前已經(jīng)存在有相同名字的互斥量,函數(shù)將返回這個已經(jīng)存在互斥量的句柄蔚舀,并且可以通過GetLastError()得到錯誤代碼ERROR_ALREADY_EXIST饵沧。可見赌躺,通過對錯誤代碼ERROR_ALREADY_EXIST的檢測可以實現(xiàn)CreateMutex()對進(jìn)程的互斥狼牺。
建立互斥體,用來同步礼患。如果一個線程獲取了互斥體是钥,則要獲取該互斥體的第二個線程將被掛起,直到第一個線程釋放該互斥體缅叠。
參數(shù)
lpMutexAttributes
指向一個SECURITY_ATTRIBUTES結(jié)構(gòu)的指針悄泥,這個結(jié)構(gòu)決定互斥體句柄是否被子進(jìn)程繼承。
bInitialOwner
布爾類型痪署,決定互斥體的創(chuàng)建者是否為擁有者
lpName
指向互斥體名字字符串的指針码泞。互斥體可以有名字狼犯。
互斥體的好處是可以在進(jìn)程間共享