【问题标题】:Single-threading two processes单线程两个进程
【发布时间】:2010-09-19 22:47:04
【问题描述】:

我有两个 C++ 进程(A 和 B),在 Windows 下执行,一个启动另一个。我想有效地单线程执行它们。例如:

  1. 启动进程 A
  2. A 创建 B
  3. A 暂停
  4. B 执行一些固定的操作
  5. B 挂起,A 恢复
  6. A 执行一组固定的操作
  7. A 挂起,B 恢复
  8. (重复 4 - 7)

哪种 Windows 同步和 IPC 服务最适合实现此类行为?

【问题讨论】:

  • 我要问:如果两个线程乒乓这样,为什么不只使用一个线程?

标签: c++ multithreading synchronization process


【解决方案1】:

对于进程间同步,您可以使用semaphores。这是documentation

【讨论】:

  • 信号量只是一种工具。互斥锁和事件可能更合适(是的,我知道您可能可以使用信号量来实现这些...)
  • 我可能会为此使用一个信号量(实际上是两个:每个方向一个),除非有未说明的并发症来防止这种情况发生。但是你“需要”使用信号量是错误的。
【解决方案2】:

在这种情况下事件会起作用:

  • A 创建事件并启动流程 B
  • A 等待事件发出信号
  • B 还创建一个事件,它是第一个项目,然后发出 A 的事件信号(该事件具有众所周知的名称,或者可以在 B 启动时将句柄传递给 B,或者使用其他机制
  • B 等待它的事件
  • 当 A 从等待其事件中恢复时,它会执行其工作,向 B 的事件发出信号并自行等待
  • 等等……

只要确保您有错误处理,以便每个进程都可以在另一个进程挂起或意外终止时恢复并执行任何必要的操作。超时可以处理挂起情况,等待其他进程的句柄(使用 WaitForMultipleObjects() 以及进程和事件句柄)可以确定其他进程是否/何时终止。

【讨论】:

  • 要记住的一点是,如果进程没有以相同的优先级运行,那么您可能希望使用具有优先级反转避免的同步原语。如果它们在等待其他进程时持有全局锁,则同样适用。不过,这通常不是必需的。
【解决方案3】:

将两个事件句柄 (CreateEvent) 传递给进程 B。当进程 a 完成工作时发出一个句柄,当进程 b 完成工作时发出另一个句柄。每个进程调用WaitForSingleObject()来等待另一个进程完成一组工作。

【讨论】:

  • 我假设@Chris 说传递两个事件句柄时,他的意思是唯一的名称。
  • 将句柄创建为可继承的,并按值传递它们。可继承的句柄在新进程中被“复制”,其值与旧进程中的值相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2011-08-14
相关资源
最近更新 更多