使用互斥锁调节两个进程之间的 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 共享内存 的方式 生产者消费者模型