簡體   English   中英

無法從另一個進程 C++ 打開現有信號量

[英]Can't open existing semaphore from another process C++

我正在嘗試從另一個進程中獲取現有的信號量。 要創建信號量,我使用了:

Semaphore(std::string name, int startState) {
    name = "Global\\" + name;
    Sem = OpenSemaphore(SYNCHRONIZE | SEMAPHORE_MODIFY_STATE, true, (LPCWSTR)name.c_str());
    int s = (startState > 0);
    if (Sem == NULL) {
        Sem = CreateSemaphore(NULL, s, 1, (LPCWSTR)name.c_str());
    }
}

在第一個過程中正確創建了信號量。 GetLastError() 返回 0。在第二個過程中,OpenSemaphore 返回 NULL。 GetLastError() 返回 2。我嘗試僅通過“名稱”獲取信號量 - 沒有“全局”,但它得到了相同的結果。 請幫忙)

如果您覺得需要使用 C 風格的轉換(例如(LPCWSTR)name.c_str() ),您應該將其視為您做錯了什么的標志。

就像你在這里做的那樣: std::string是一個字符(即char )字符串,而你使用字符( wchar_t )函數。 這意味着名稱將不是您所期望的。

如果您繼續使用std::string您必須使用“ANSI”函數(例如CreateSemaphoreA )。 否則切換到使用寬字符的std::wstring

@SomeProgrammerDude 的回答解釋了您看到的錯誤的原因(字符編碼不匹配)。

我只想指出,在解決了該問題之后,您的代碼中仍然存在競爭條件。

如果你想打開一個現有的信號量(或任何其他類型的命名 kernel 對象),如果它不存在就創建它,那么不要浪費時間打開它,只需無條件地創建它,例如:

Semaphore(std::string name, int startState) {
    name = "Global\\" + name;
    int s = (startState > 0);
    Sem = CreateSemaphoreA(NULL, s, 1, name.c_str());
}

如果 object 已經存在,您將獲得現有 object 的句柄。 否則你會得到一個新的 object 的句柄。 如果需要, GetLastError()可用於告訴您 object 是否已經存在或重新創建。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM