多个实例中的互斥行为问题

问题描述 投票:0回答:1

我在尝试运行使用互斥体同步通信的程序的两个实例时遇到问题。当我使用

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;
}

有什么见解或建议吗?

c++ windows winapi
1个回答
0
投票

在这种情况下您不应该使用

bInitialOwner=true
。 初始进程从
CreateMutexW()
本身获取所有权,并且永远不会释放它,然后使用 WaitForSingleObject()
增加
所有权,并使用 ReleaseMutex()
减少
,但初始所有权仍被保留。

在两个进程中都使用

bInitialOwner=false
来代替。

© www.soinside.com 2019 - 2024. All rights reserved.