【问题标题】:How do I synchronize two processes in C++ (Windows)?如何在 C++ (Windows) 中同步两个进程?
【发布时间】:2015-07-07 13:44:02
【问题描述】:

父进程通过调用 CreateProcess() 方法启动子进程,该方法甚至在子进程初始化之前立即返回。如何让父进程等到子进程初始化并开始执行? WaitForSingleObject() 调用使父进程等待子线程终止或超时。

有没有类似的方法让父进程等待子进程初始化?

【问题讨论】:

  • “初始化”是什么意思?
  • 初始化,我的意思是子进程已经开始执行。

标签: c++ winapi process synchronization


【解决方案1】:

您可以在父进程的WinAPI中create a named event并将其设置为无信号状态。在事件句柄上调用 WaitForSingleObject。然后在子进程中,您可以在子进程初始化后按名称打开事件并发出信号(调用SetEvent())。

【讨论】:

  • 我想知道,为什么 Eralp 的答案没有投票,至少在 c# 中 join 可能是最常见的方式,如果我没记错的话,那么为什么不在 c++ 上使用它呢?
  • 请注意,事件名称必须是唯一的。 (如果父进程的两个副本正在运行怎么办?)最简单的方法是在名称中包含子进程 ID,尽管无论子进程是否正常,您都必须小心确保代码正常工作或者父级创建事件对象。
  • @HarryJohnston:这实际上很容易解决:在创建子进程之前在父进程中创建事件,为事件名称创建 GUID,在启动时将 GUID 传递给子进程。修复了唯一性和创建顺序。
  • @HarryJohnston:子PID只有在子进程启动后才存在,导致事件创建竞争条件。获取子进程的 GUID 很简单,只需在命令行中传递即可。
  • @MSalters:通过创建带有CREATE_SUSPENDED 标志的孩子,可以轻松解决比赛。子 PID 在进程对象被创建之后存在。不必启动主线程即可获得 PID。
【解决方案2】:

如果您使用线程,让父线程等待子线程完成的最简单方法之一是使用 .join() 函数。在父进程的最终使用

child.join();

【讨论】:

  • 问题是关于进程之间的同步,而不是关于 1 个进程内的线程同步
猜你喜欢
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-24
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
相关资源
最近更新 更多