我在尝试运行使用互斥体同步通信的程序的两个实例时遇到问题。当我使用
CreateMutexW
创建互斥体并将 bInitialOwner
参数设置为 true
(这意味着程序最初拥有互斥体)时,出现了问题。在第一个实例释放互斥锁后,第二个实例(稍后运行的实例)无法获取该互斥锁;它一直等待互斥体被释放。与此同时,第一个实例陷入一个循环,它不断写入和读取数据,同时仍然持有互斥锁。
重要的是,这种情况不会导致僵局;相反,第二个实例无法获取互斥体,因为第一个实例在其循环中不断释放并重新获取它。如果我将
bInitialOwner
设置为 false
,则不会出现此问题。
我想了解当程序尝试等待
WaitForSingleObject(Mutex, INFINITE);
而它仍然是互斥体的所有者时会发生什么。
这是我的代码的相关部分:
#include <iostream>
#include <windows.h>
int main() {
// Create file mapping
HANDLE FileHandle = CreateFileMappingW(INVALID_HANDLE_VALUE, nullptr, PAGE_READWRITE, 0, 255, L"MY");
if (FileHandle == NULL) {
std::cerr << "Unable to create file mapping: " << GetLastError() << std::endl;
return 1;
}
// Create mutex
HANDLE Mutex = CreateMutexW(nullptr, true, L"share");
if (Mutex == NULL) {
std::cerr << "Unable to create mutex: " << GetLastError() << std::endl;
CloseHandle(FileHandle);
return 1;
}
// Create semaphore
HANDLE Semaphore = CreateSemaphoreW(nullptr, 0, 1, L"NUM");
if (Semaphore == NULL) {
std::cerr << "Unable to create semaphore: " << GetLastError() << std::endl;
CloseHandle(Mutex);
CloseHandle(FileHandle);
return 1;
}
// Map view
char *charw = (char *)MapViewOfFile(FileHandle, FILE_MAP_ALL_ACCESS, 0, 0, 255);
if (charw == nullptr) {
std::cerr << "Unable to map view: " << GetLastError() << std::endl;
CloseHandle(Semaphore);
CloseHandle(Mutex);
CloseHandle(FileHandle);
return 1;
}
// Check if the memory region is already open
BOOL flag = (GetLastError() == ERROR_ALREADY_EXISTS);
if (flag) {
std::cout << "Opened memory region, waiting for messages\n";
while (flag) {
WaitForSingleObject(Mutex, INFINITE);
std::cout << "Content in memory: " << charw << std::endl;
ReleaseMutex(Mutex);
WaitForSingleObject(Mutex, INFINITE);
std::cout << TEXT("Input data into shared memory: ");
std::cin.getline(charw, 255);
ReleaseMutex(Mutex);
}
} else {
while (1) {
WaitForSingleObject(Mutex, INFINITE);
std::cout << TEXT("Input data into shared memory: ");
std::cin.getline(charw, 255);
ReleaseMutex(Mutex);
WaitForSingleObject(Mutex, INFINITE);
std::cout << "Content in memory: " << charw << std::endl;
ReleaseMutex(Mutex);
}
}
UnmapViewOfFile(charw);
CloseHandle(Semaphore);
CloseHandle(Mutex);
CloseHandle(FileHandle);
return 0;
}
有什么见解或建议吗?
在这种情况下您不应该使用
bInitialOwner=true
。 初始进程从 CreateMutexW()
本身获取所有权,并且永远不会释放它,然后使用 WaitForSingleObject()
增加所有权,并使用
ReleaseMutex()
减少,但初始所有权仍被保留。
在两个进程中都使用
bInitialOwner=false
来代替。