2017-03-19 60 views

回答

0

回答我的問題,因爲我在其他問題中沒有找到其他人解決這個問題。

這可以使用boost/interprocess/sync/named_mutex(I使用boost 1.63

我在兩個LinuxWindows測試和實現防止打開所述應用程序的第二實例的跨平臺的方式來實現。

我發現的問題是,如果我殺死進程(在兩個平臺上),互斥不會被刪除,因爲不會調用析構函數~MyApplication。因此,只有在系統重新啓動後,我才能夠再次運行應用程序。

#include <boost/interprocess/sync/named_mutex.hpp> 
#include <iostream> 

class MyApplication 
{ 
public: 
    MyApplication() = default; 

    ~MyApplication() 
    { 
     if (mLockedByThisInstance) 
     { 
      boost::interprocess::named_mutex::remove("myApplicationMutex"); 
     } 
    } 

    bool IsAlreadyRunning() 
    { 
     mLockedByThisInstance = mNamedMutex.try_lock(); 

     if (!mLockedByThisInstance) 
     { 
      return true; 
     } 

     return false; 
    } 

    int Run(int argc, char *argv[]) 
    { 
     // Application main loop    
     return 0; 
    } 

private: 
    bool mLockedByThisInstance = false; 
    boost::interprocess::named_mutex mNamedMutex{ boost::interprocess::open_or_create, 
     "myApplicationMutex" }; 
}; 

int main(int argc, char *argv[]) 
{ 
    MyApplication myApplication; 

    if (myApplication.IsAlreadyRunning()) 
    { 
     std::cout << "MyApplication is already running!\n"; 
     return 1; 
    } 

    return myApplication.Run(argc, argv); 
} 
+0

「所以只有系統重新啓動後,我才能夠再次運行應用程序。」我認爲這應該值得一提的錯誤報告。 – tobsen

0

這不是一個真正的完整答案,而是像拿着一個特定的文件句柄來進行獨佔訪問。您可以像使用互斥體一樣使用它,但還有一個額外的好處,即操作系統應該自動清理進程終止時的句柄。

我不能說,如果這將在Linux上工作,但至少在Windows上,這應該讓你達到相同的效果。希望有所幫助。

相關問題