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

Posted

技术标签:

【中文标题】使用互斥锁调节两个进程之间的 IPC【英文标题】:Regulating IPC between two processes with mutex 【发布时间】:2011-07-11 15:55:02 【问题描述】:

我正在做一个创建两个进程的项目,我想规范它们之间的 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;
 

在过程二中,我用 open mutex 打开 mutex 并注释 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;

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

【问题讨论】:

仅供参考 - Windows 也有信号量 (CreateSemaphore),尽管如果您只需要一个锁,互斥锁会更好,因为它会检测到死互斥锁持有者。 【参考方案1】:

如果您检查这些 Win32 API 调用的错误,那将是显而易见的。 OpenMutex 调用一定是失败的,因为这段代码是写的,因为还没有其他人使用该名称创建互斥锁。

来自OpenMutex docs:

OpenMutex 函数允许多个进程打开 同一个互斥对象。 只有当某个进程有 已经使用 CreateMutex 函数创建了互斥锁。

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

【讨论】:

感谢您的反馈!我检查了我的 WINAPI 调用中的错误,并且打开调用确实失败了。而且我忘记在 mutexCreate 调用中提供互斥锁名称。 好消息 - 如果您养成检查所有这些 API 调用的习惯,并通过适当的错误输出优雅地失败,这将减轻很多痛苦【参考方案2】:

您使用 CreateMutex 创建匿名 Mutex,然后尝试按名称查找它

【讨论】:

感谢您的反馈,所以我用进程 1 创建了一个互斥锁,然后用进程 2 找到它?我怎么找到它,你有例子吗? CreateMutex 和 OpenMutex 都有一个参数LPCTSTR lpName,你不用它 CreateMutex 我不知道 MUTEXNAME 在你的 OpenMutex 中是什么值【参考方案3】:

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

【讨论】:

以上是关于使用互斥锁调节两个进程之间的 IPC的主要内容,如果未能解决你的问题,请参考以下文章

20181229(守护进程,互斥锁,IPC,生产者和消费者模型)

Python学习第20篇:互斥锁以及进程之间的三种通信方式(IPC)以及生产者个消费者模型

35 守护进程 互斥锁 IPC 共享内存 的方式 生产者消费者模型

python全栈开发基础第二十一篇互斥锁以及进程之间的三种通信方式(IPC)以及生产者个消费者模型

守护进程互斥锁队列和IPC机制

守护进程,互斥锁,IPC,队列,生产者与消费者模型