【问题标题】:Interesting c++ [inter] process synchronization有趣的 c++ [inter] 进程同步
【发布时间】:2014-11-18 18:08:54
【问题描述】:

假设您有 n 个进程,其中 n 是动态的。它们可以在同一台机器上运行,也可以跨网络运行。想象一下,在命令行上给每个进程一个要读取的 [csv] 文件。每行的内容被推送到元组的 std::vector 上。每个进程对应的每个文件都有不同的大小。不同的机器可以有不同的速度,更不用说它们的磁盘可能比彼此快得多/慢得多。此外,这些文件包含时间戳。第一阶段读取整个文件。在处理内存中的行时,可以告诉每个进程在到达具有特定时间戳的行时或在读取整个文件后立即处于就绪状态。请注意,每个过程可能需要完全不同的时间才能到达“正确的路线”。一个进程在收到启动信号之前无法启动下一个阶段,这意味着所有其他进程也已准备好启动。

我的问题是,让所有进程相互同步的最佳方式是什么,这样当每个进程读取文件并读取到它所请求的时间时,它们都会收到信号,以便所有进程都准备好启动下一阶段的运营。但是,它们不会轮询所有其他进程以进入就绪状态。相反,它们是同步等待或其他一些机制。一旦他们说他们准备好了,他们都会在彼此的 50 微秒内开始(现在不用担心网络时间同步,我只是在谈论网络抖动)。

在 c++11 中 [有/无 boost] 中的某些情况下,两个进程相互发送信号的简单示例 [可能有一个额外的主进程作为中介处理所有同步] 是有用的。如果有一个处理同步的主进程,只要它运行在 linux 上,它用什么语言编写都没有关系。但是“从属”进程必须在 c++11 中。

【问题讨论】:

  • 所有从站都可以将“就绪”消息推送到消息队列中。一个知道有多少从站的主进程可以监视这个队列并等待所有从站发送就绪状态,然后再向所有从站发出请求,可能通过网络广播来考虑所需的抖动方差。
  • 是的,我就是这么想的。启动时的每个进程都将其 pid 推送到 [remote] 队列。队列会记住所有向它注册的进程。然后当一个进程处于就绪模式时,它会弹出相同的 ID。当队列为空时,它们都由队列发出信号。这是我感兴趣的细节。
  • 好吧,我不会依赖 PID,因为它与机器无关。您需要在进程 ID 之上添加一些机器 ID。至于细节,有几十种消息队列系统可用,如 MSQS、ASQS、IronMQ 等。您应该评估它们的功能集并选择最适合您的一种。该选择将影响您设计的实现细节。一旦你有更具体的问题,你可以回来。
  • 对,我的意思是IP地址+ pid等。

标签: c++11 boost process signals semaphore


【解决方案1】:
  1. 使用http://en.wikipedia.org/wiki/Precision_Time_Protocol 同步所有机器上的时钟。

  2. 创建一个主进程,作为 UDP 客户端运行。

  3. 所有从属进程都作为 UDP 服务器运行。

  4. 从属进程向主进程发送“就绪”数据包。

  5. 一旦所有从站都准备就绪,主站会向所有从站发送 UDP 广播消息。该消息包含一个未来(不会太远,刚好足以克服网络延迟)时间戳,供所有从站在该时间点开始下一次同步操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 2016-03-31
    • 2011-01-12
    • 2019-09-28
    • 1970-01-01
    • 2019-06-17
    • 1970-01-01
    相关资源
    最近更新 更多