使用互斥锁调整两个进程之间的IPC

时间:2011-07-11 15:55:02

标签: c++ process synchronization ipc

我正在开发一个创建两个流程的项目,我想在它们之间规范IPC。

使用createProces函数创建进程,我想使用互斥进行一些IPC。

在Linux中我用信号量做这个,但是我已经读过,对于Windows中的IPC,我必须使用互斥锁。

在Windows中我似乎无法让它工作。首先,我创建这样的踏板:

CreateProcess(IpApplicationName, NULL, NULL, NULL, FALSE,   CREATE_NEW_CONSOLE, NULL, NULL,     &StartInfo, &ProcessInfo);
CreateProcess(IpApplicationName, NULL, NULL, NULL, FALSE,   CREATE_NEW_CONSOLE, NULL, NULL,     &StartInfo2, &ProcessInfo2);

进程启动正常,但是当我从一个进程中删除releaseMutex调用时,它将不会在该进程中等待。这是第一步:

volatile HANDLE hMutex; // Global hMutex Object


int main()
{
     hMutex=CreateMutex(NULL,FALSE,NULL);

    while(1)
    {

        WaitForSingleObject(hMutex,INFINITE);
        printf("Thread writing to database...\n");
        Sleep(2000);
        ReleaseMutex(hMutex);
    }

    return 0;
 }

在第二个过程中,我打开互斥锁并打开互斥锁,然后对releaseMutex进行评论(这样它就会卡在这里,进行测试。但是它会继续运行):

int main()
{

 while(1)
 {
    HANDLE hMutex;

    hMutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,MUTEXNAME);

    WaitForSingleObject(hMutex,INFINITE);
    printf("Thread writing to database22...\n");
    Sleep(2000);
    //ReleaseMutex(hMutex);
 }

    return 0;
}

谁能告诉我我做错了什么?

3 个答案:

答案 0 :(得分:4)

如果您正在检查这些Win32 API调用的错误,那将是显而易见的。 OpenMutex调用必须失败,因为编写了此代码,因为还没有其他人创建具有该名称的互斥锁。

来自OpenMutex docs

  

OpenMutex功能允许多个进程打开句柄   相同的互斥对象。 只有某个进程具有该功能才能成功   已经使用CreateMutex函数创建了互斥锁。

每个Win32 API都可能失败 - 您需要检查并正确处理这些错误。

答案 1 :(得分:1)

您使用CreateMutex创建匿名互斥锁,然后尝试按名称

找到它

答案 2 :(得分:0)

您必须在CreateMutex和OpenMutex中提及UNIQUE互斥锁名称。