C++11 有趣的c++;[内部]进程同步

C++11 有趣的c++;[内部]进程同步,c++11,boost,process,signals,semaphore,C++11,Boost,Process,Signals,Semaphore,假设有n个进程,其中n是动态的。它们可以在同一台机器上运行,也可以跨网络运行。假设每个进程在命令行上都有一个要读取的[csv]文件。每行的内容都被推送到tuple的std::vector上。与每个进程对应的每个文件的大小不同。不同的机器可以有不同的速度,更不用说它们的磁盘可能比其他机器快得多/慢得多。此外,这些文件包含时间戳。第一阶段读取整个文件。在处理内存中的行时,可以在到达具有特定时间戳的行时或读取整个文件后立即告知每个进程处于就绪状态。请注意,每个进程可能需要完全不同的时间才能到达“正确的

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

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

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

  • 用于同步所有机器上的时钟

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

  • 所有从进程都作为UDP服务器运行

  • 从进程向主进程发送“就绪”数据包

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


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