3

我有两个进程正在通信。第一个将数据写入管道或 fifo(我都尝试过),第二个读取其中的内容。目前发送的数据是直接来自传感器的六个浮点数,因此需要经常上传(10Hz)。

问题是读取数据的过程有点“重”,它可能无法足够快地读取。管道将满,读取将延迟到程序结束。

因为不能容忍这样的延迟,所以我可以在写入部分检测管道是否已满(在这种情况下,如果我错了,请纠正我,它会等待它有足够的空间来写入数据)。如果可以进行这样的检测,我怎样才能清除管道中的内容,以便读取部分立即接收最新数据,而不必遍历整个管道中的旧螺柱?

简而言之,有没有办法只清空其数据的管道(不必关闭并重新打开将是一个加号)。

非常感谢,

4

1 回答 1

0

这将减少管道充满的频率,但不会消除它。

范式改变:调整阅读器以丢弃一定百分比的阅读。

写入
器 当写入器看到一个完整的队列时,它写入的下一个数字是一个特殊的数字(例如 NaN),然后它写入所需的数字。

阅读
器 阅读器设置为丢弃 P% 的数字。

阅读器读取一个数字 - 根据需要等待。如果不是扔掉的候选人,照常进行。

当读者考虑丢弃一个数字以满足其丢弃百分比时,它首先测试管道是否为空。如果是这样,读者知道减少被丢弃的百分比并使用第一次阅读的数字。如果管道不为空,它会读取管道,丢弃第一个数字并使用第二个。

当阅读器读取特殊数字时,它知道它没有丢弃足够的数字并增加其百分比,然后它再次读取管道。

如果读写器端的整体性能变化不大,那么读写器每隔一段时间就会丢掉 1 个数字,以平衡 swift writer 和缓慢的 reader 性能。如果一个空队列比一个完整队列有轻微的倾斜,管道很少会填满,而读者会更频繁地收到新的数字。

于 2013-06-07T19:23:53.673 回答