假设您有n个进程,其中n是动态的。它们可以在同一台机器上运行,也可以在网络上运行。想象一下,每个进程都在命令行上给出一个要读取的[csv]文件。每行的内容被推送到元组的std :: vector。与每个进程对应的每个文件都具有不同的大小。不同的机器可以具有不同的速度,更不用说它们的磁盘可以比彼此快得多/慢。此外,文件包含时间戳。第一阶段读取整个文件。处理内存中的行时,可以在达到具有特定时间戳的行时或在读取整个文件后立即告知每个进程处于就绪状态。请注意,它可以使每个过程完全不同的时间到达"右线。"一个过程无法启动下一个阶段,直到它被指示启动,这个问题意味着所有其他阶段也准备好开始。
我的问题是,让所有进程彼此同步的最佳方法是什么,以便当每个进程读取文件并读取其请求的时间时,它们都会发出信号以便所有进程准备开始下一阶段的运作。但是,它们不会轮询所有其他进程以进入就绪状态。相反,他们是同步等待或其他一些机制。一旦他们全部说他们已经准备好了,他们都会在50微秒之内相互开始(现在不担心网络时间同步,我只是在讨论网络抖动)。
在c ++ 11 [有/没有boost]的网络中某种情况下,两个进程相互发信号的可能[可能还有一个额外的主进程处理所有同步作为中介]的简单示例很有用。如果有一个处理同步的主进程,只要它在linux上运行就没有问题。但是"奴隶"进程必须在c ++ 11中。
答案 0 :(得分:0)
使用http://en.wikipedia.org/wiki/Precision_Time_Protocol同步所有计算机上的时钟。
创建一个主进程,以UDP客户端身份运行。
所有从属进程都作为UDP服务器运行。
从属进程发送" ready"包给主人。
一旦所有从站都准备就绪,主站就会向所有从站发送UDP广播消息。该消息包含所有从属设备的未来(不太远,足以克服网络延迟)时间戳,以便在该时间点开始下一个同步操作。