有時候需要讓程序單例執行,以防止多個例項導致異常,windows下可以使用系統事件來實現,比如event、mutex等,event和mutex在建立的時候如果物件已存在,getlasterror會返回error_already_exists,可以以此實現程序單例:
handle createevent(
lpsecurity_attributes lpeventattributes,// 安全屬性,如果為空的話表示控制代碼不能被子程序繼承,大部分情況設定為null即可
bool bmanualreset,// 復位方式,true表示手動setevent復位,false表示執行緒結束自動復位,一般false就可以
bool binitialstate,// 初始狀態,初始為有訊號還是無訊號狀態
lpctstr lpname // 物件名稱,是否命名,如果設定成null的話就達不到程序單例的目的了
);
**:
auto h = ::createevent(null, false, true, _t("already running"));
auto err = getlasterror();
if (err == error_already_exists)
效果:可以看到確實以單例方式執行了。
如果createevent的時候建立了匿名物件(最後乙個引數設定為null),那麼就達不到單例的效果:
可以看到多個例項在執行。
handle createmutex(
lpsecurity_attributeslpmutexattributes, // 安全屬性
bool binitialowner, // 互斥物件的所有者,true表示建立之後建立執行緒立即擁有該mutex
lpctstr lpname // 物件命名,null為匿名
);
**:
auto handle = ::createmutex(null, true, _t("already_running"));
auto err = getlasterror();
if (err == error_already_exists)
if (handle)
效果:效果與event方式的一樣,就不上圖了。 作業系統 單例程序 單例守護程序
一 單例程序 檔案鎖主函式 二 單例守護程序 filelock.h ifndef filelock h define filelock h include include include include include include include include fcntl函式的包裝,帶w表示阻...
程序單例模式
不同於執行緒單例模式,很多時候我們希望乙個程式只有乙個例項在執行。常規的做法有建立乙個命名檔案,通過判斷這個檔案存在不存在來確定是否已經有程序例項啟動 更進一步,可以通過對檔案加鎖的方式,從而避免前面方法中需要在程式退出時刪除檔案的操作,但是檔案加鎖 需要檔案系統的支援。fat32等檔案系統不一定支...
單例模式 Windows下防止多開簡介
單例模式 singleton pattern 是一種常見的軟體設計模式,在使用這個模式時,單例物件的類必須保證在全域性中有且只有乙個例項存在,並且提供了乙個全域性訪問的介面,這樣有利於我們協調系統整體的行為。1.在某個伺服器程式中,所以的配置資料都在乙個檔案中存放,這時可以統一使用乙個單例物件對配置...