windows下程序單例

2021-07-28 09:04:08 字數 1361 閱讀 2498

有時候需要讓程序單例執行,以防止多個例項導致異常,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.在某個伺服器程式中,所以的配置資料都在乙個檔案中存放,這時可以統一使用乙個單例物件對配置...