【问题标题】:Pipe/FIFO clearing in CC中的管道/ FIFO清除
【发布时间】:2013-06-06 14:37:47
【问题描述】:

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

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

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

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

非常感谢,

【问题讨论】:

  • “清除管道”的常用方法是从它read()
  • 是的,但是需要几个 read() 才能获取新数据,并且会造成延迟(实际上它确实是我现在正在做的事情,带有 @ 987654323@)
  • 您可以只将文件(管道)映射到您的程序映像中(启用按需分页),但如果这有助于您加快速度,请不吝赐教。确保刷新正在写入管道的写入缓冲区
  • 要么过滤 write() 放入管道的内容,因此不会填充不必要的内容

标签: c pipe delay fifo


【解决方案1】:

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

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

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

阅读器
读者会扔掉 P% 的数字。

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

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

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

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

【讨论】:

  • 这看起来很有趣,我会尝试实现它。
  • 期待结果的消息
猜你喜欢
  • 1970-01-01
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
相关资源
最近更新 更多