我有两个进程在通信。第一个将数据写入管道或 fifo(我都试过了),第二个读取其中的内容。目前发送的数据是直接来自传感器的六个 float ,因此需要经常上传(10Hz)。
问题是进程读取数据有点“重”,可能读取速度不够快。管道将满,读取将延迟到程序结束。
因为不能容忍这样的延迟,我可以在写入部分检测管道是否已满(在这种情况下,如果我错了,请纠正我,它会等待它有足够的空间来写入数据) .如果可以进行这样的检测,我怎样才能只清除管道的内容,以便读取部分立即接收到最新数据,而不必遍历充满旧 studd 的整个管道?
简而言之,有没有一种方法可以清空其数据管道(不必关闭并重新打开会更好)。
非常感谢,
最佳答案
这将减少管道充满的频率,但不会消除它。
范式改变:调整阅读器以丢弃一定比例的阅读。
作家
当 writer 看到一个完整的队列时,它写入的下一个数字是一个特殊数字(例如 NaN),然后写入所需的数字。
阅读器
读者将丢弃 P% 的数字。
读取器读取一个数字 - 根据需要等待。如果不是要丢弃的候选人,则照常进行。
当读取器考虑丢弃一个数字以满足其丢弃百分比时,它首先测试管道是否为空。如果是这样,读者就知道要减少被扔掉的百分比并使用第一次阅读的数字。如果管道不为空,它会读取管道,丢弃第一个数字并使用第二个数字。
当读取器读取特殊数字时,它知道它没有丢弃足够的数字并增加其百分比,然后再次读取管道。
如果读取器和写入器端的整体性能差异不大,读取器将每隔一段时间丢弃 1 个数字,以平衡快速写入器和缓慢读取器的性能。如果稍微偏向于空队列而不是满队列,管道将很少填满,读者将更频繁地收到新数字。
关于c - C中的管道/FIFO清除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16964985/