我正在嘗試從另一個行程中獲取現有的信號量。要創建信號量,我使用:
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。我試圖僅通過“名稱”獲取信號量 - 沒有“全域\”,但它得到了相同的結果。請幫忙)
uj5u.com熱心網友回復:
如果您覺得需要使用 C 風格的強制轉換(如 中(LPCWSTR)name.c_str()),您應該將其視為您做錯了什么的標志。
就像您在這里所做的那樣:std::string是一個窄字符(即char)字串,而您使用寬字符( wchar_t) 函式。這意味著名稱不會是您所期望的。
如果繼續使用std::string,則必須使用“ANSI”函式(例如CreateSemaphoreA)。否則切換到std::wstring哪個使用寬字符。
uj5u.com熱心網友回復:
@SomeProgrammerDude 的回答解釋了您所看到的錯誤的原因(字符編碼不匹配)。
我只想指出,在解決該問題后,您的代碼中仍然存在競爭條件。
如果你想打開一個現有的信號量(或任何其他型別的命名內核物件),如果它不存在就創建它,那么不要浪費時間打開它,只需無條件地創建它,例如:
Semaphore(std::string name, int startState) {
name = "Global\\" name;
int s = (startState > 0);
Sem = CreateSemaphoreA(NULL, s, 1, name.c_str());
}
如果物件已經存在,您將獲得現有物件的句柄,而輸入引數將被忽略。否則,您將獲得使用引數初始化的新物件的句柄。GetLastError()如果需要,可用于告訴您物件是已經存在還是重新創建。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/388570.html
下一篇:如何加速這個Python回圈
