一.目錄互斥方案:這種互斥要求同一目錄下不能運(yùn)行兩個(gè)應(yīng)用程序的實(shí)例,通常用文件解決之,即程序啟動(dòng)時(shí)看看所在目錄下有沒(méi)有一個(gè)特定文件的存在,在的話(huà)就退出,不在的話(huà)就自己創(chuàng)建一個(gè),退出時(shí)再刪除之。這種情況下,這個(gè)臨時(shí)文件便成了同一目錄下程序已經(jīng)啟動(dòng)實(shí)例的標(biāo)志。為了避免誤刪除導(dǎo)致此功能失常,可以給文件加上隱藏屬性。
二.本機(jī)互斥方案:這種互斥要求在一臺(tái)機(jī)器上只能運(yùn)行一個(gè)實(shí)例。一種解決辦法是在注冊(cè)表的特定位置進(jìn)行記錄,原理和文件互斥類(lèi)似;另一個(gè)解決辦法是利用端口,即程序啟動(dòng)后在某一端口進(jìn)行監(jiān)聽(tīng),這樣第二個(gè)實(shí)例啟動(dòng)時(shí)再去監(jiān)聽(tīng)就不可行了,這種方式很巧妙,無(wú)須顧忌程序異常退出問(wèn)題,只是會(huì)無(wú)端占用一個(gè)端口,有時(shí)客觀環(huán)境不允許這么干。
三.單用戶(hù)互斥方案:這種互斥要求系統(tǒng)只允許同名用戶(hù)登錄一次,因此服務(wù)器端必須存放用戶(hù)對(duì)應(yīng)的數(shù)據(jù),當(dāng)用戶(hù)登上時(shí)檢查這部分?jǐn)?shù)據(jù)就可以了,這種方式最棘手的是客戶(hù)端程序的異常退出導(dǎo)致再也無(wú)法登錄,但讓客戶(hù)端發(fā)心跳包或是服務(wù)器端反連客戶(hù)端來(lái)解決。
綜上,互斥功能要成功,就要找到互斥對(duì)象共同的環(huán)境或是上下文。如果找到了,互斥就變成了一個(gè)技術(shù)問(wèn)題。
二.本機(jī)互斥方案:這種互斥要求在一臺(tái)機(jī)器上只能運(yùn)行一個(gè)實(shí)例。一種解決辦法是在注冊(cè)表的特定位置進(jìn)行記錄,原理和文件互斥類(lèi)似;另一個(gè)解決辦法是利用端口,即程序啟動(dòng)后在某一端口進(jìn)行監(jiān)聽(tīng),這樣第二個(gè)實(shí)例啟動(dòng)時(shí)再去監(jiān)聽(tīng)就不可行了,這種方式很巧妙,無(wú)須顧忌程序異常退出問(wèn)題,只是會(huì)無(wú)端占用一個(gè)端口,有時(shí)客觀環(huán)境不允許這么干。
三.單用戶(hù)互斥方案:這種互斥要求系統(tǒng)只允許同名用戶(hù)登錄一次,因此服務(wù)器端必須存放用戶(hù)對(duì)應(yīng)的數(shù)據(jù),當(dāng)用戶(hù)登上時(shí)檢查這部分?jǐn)?shù)據(jù)就可以了,這種方式最棘手的是客戶(hù)端程序的異常退出導(dǎo)致再也無(wú)法登錄,但讓客戶(hù)端發(fā)心跳包或是服務(wù)器端反連客戶(hù)端來(lái)解決。
綜上,互斥功能要成功,就要找到互斥對(duì)象共同的環(huán)境或是上下文。如果找到了,互斥就變成了一個(gè)技術(shù)問(wèn)題。