正确协调两个进程之间的状态

Posted

技术标签:

【中文标题】正确协调两个进程之间的状态【英文标题】:Proper coordination of state between 2 processes 【发布时间】:2013-04-17 15:32:54 【问题描述】:

我有 2 个要同步的进程:

第一个进程(客户端)启动另一个进程(启动一些 WCF 服务的服务器应用程序),并等待它达到某个状态。

我希望客户端进程启动服务器,并阻塞直到所有服务启动。

为此,服务器初始化一个 Mutex 对象并使用它向客户端发出信号,表明它已完成。

这种方法的问题在于,客户端不知道何时互斥锁实际上已完成设置互斥锁以及何时开始等待它。

是否有任何正式的算法/协议(暂时将编程语言放在一边)来协调此类任务?

【问题讨论】:

听起来你需要一个跨进程事件而不是互斥锁。您只想等到服务器发出完成的信号。有关创建事件以使其可以跨进程共享的更多详细信息,请参阅此答案:***.com/questions/2590334/… 【参考方案1】:

解决方案是在启动服务器之前直接在客户端中设置信号量,并使用与最初计划相同的机制让其他进程知道它必须使用哪个同步对象。 p>

在伪代码中,基本轮廓是这样的:

客户:

create semaphore with initial count at 0;
spawn server;
wait on semaphore;

服务器:

process jobs;
release semaphore;

对于任何一个进程,问题都解决了:因为信号量设置为0,客户端完成的wait会阻塞,直到服务器releases它。

Msdn 文档:

Semaphore Objects CreateSemaphore ReleaseSemaphore

【讨论】:

所以:客户端创建互斥体,启动服务器。服务端获取互斥量,客户端怎么知道服务端获取的时间? (知道它应该自己开始等待吗?) 您的示例缺少服务器需要获取互斥锁的事实。现在这是它和客户端之间的竞争条件。 刚刚修复它。在 unix 系统上,我会使用信号量,我意识到这里也存在该设备,所以你有它。

以上是关于正确协调两个进程之间的状态的主要内容,如果未能解决你的问题,请参考以下文章

Zookeeper简单配置

两个子进程之间的 Python 管道输出

Linux进程间通信的方式都有哪些

在进程之间共享活动对象的正确方法是啥?

进程同步为什么不叫进程协调?

网编提高 进程阶段