您可以使用CreateMutex
函數來創建一個系統範圍的命名互斥體來表示您的進程是否正在運行。它將返回ERROR_ALREADY_EXISTS
進程是否已經運行:
(void)::CreateMutex(NULL,
TRUE,
TEXT("My_Special_Invokation_Test_Mutex"));
switch (::GetLastError()) {
case ERROR_SUCCESS:
// Process was not running already
break;
case ERROR_ALREADY_EXISTS:
// Process is running already
break;
default:
// Error occured, not sure whether process is running already.
break;
}
現在,如果你堅持不使用互斥體,您可以使用CreateFile
函數。請確保爲dwShareMode
字段傳遞零以獲得排他性訪問語義CREATE_NEW
爲dwCreationDisposition
字段(以便您只在不存在文件的情況下創建該文件)和FILE_FLAG_DELETE_ON_CLOSE
爲dwFlagsAndAttributes
參數,以便一旦您的文件被刪除過程終止。事情是這樣的:
LPCTSTR lockFileName = ...;
(void)::CreateFile(lockFileName,
GENERIC_READ,
0,
NULL,
CREATE_NEW,
FILE_FLAG_DELETE_ON_CLOSE,
NULL);
switch (::GetLastError()) {
case ERROR_SUCCESS:
// Process was not running already
break;
case ERROR_FILE_EXISTS:
// Process is running already
break;
default:
// Error occured, not sure whether process is running already.
break;
}
見約Temporary file generation and usage best practices如何安全處理的臨時文件這篇文章。
長話短說,當然可以爲你的任務使用鎖定文件,但我認爲這很難做到這一點。
*「我對使用互斥體不感興趣」,但是爲什麼? – Nawaz
解釋原因需要很長時間,但我需要非互斥解決方案。 –
然後使用事件或任何*共享*對象方法。 – Nawaz