【问题标题】:QSemaphore - implementing overwrite policyQSemaphore - 实现覆盖策略
【发布时间】:2021-11-16 06:26:34
【问题描述】:

我想为经典的Producer--Consumer 交互实现环形缓冲区。未来PC 都将实现为在数据处理任务期间运行的永久线程,GUI 将是第三个线程,仅用于显示实际数据并通过用户交互来协调数据处理的开始和停止。 C 能够完全处理所有传入的数据可能会很慢,但只有一点点和很短的时间。所以我只想分配几个P 的MTU 大小的环形缓冲区,但无论如何,如果C 处理现有数据的速度太慢,可以松散旧数据以支持新数据(覆盖政策)。

我在 Qt 帮助中阅读了QSemaphore 示例,并意识到通过使用信号量的获取和释放,我只能实现 discard 策略,因为获取队列中的指定块将阻塞,直到有没有可用空间。

是否有任何方法可以与QSemaphore 一起实施 overwrite 政策,或者我只需要去实施另一种方法?

【问题讨论】:

  • 也许可以使用doc.qt.io/qt-5/qqueue.html 代替上面的方法,并且对于每个 enqueue(),通过弹出消费者仍未使用的项目来控制队列的最大大小。
  • 你建议完全使用qqueue代替信号量还是仅仅作为数据存储的容器?如果你的意思是后者,我担心我不得不使用提供的库的环形缓冲区来存储数据。如果你的意思是前者,我应该如何实现同步?互斥方法是可能的方法之一,但它会阻塞并且会降低性能
  • 队列的每次写入和读取都应该受到互斥锁保护。先试一试,再看看性能如何。

标签: multithreading qt


【解决方案1】:

我已经找到了这个解决方案。如果我们应该不惜一切代价将部分 src 数据推送到环形缓冲区(可以丢弃可能的新传入数据),我们应该在 Producer 部分使用acquire() - 这将为我们提供 discard 策略。如果我们需要 overwrite 策略,我们应该在 Producer 中使用 tryAcquire() - 因此在第一时间只有最新的数据会被推送到环形缓冲区

【讨论】:

  • 您考虑过等待条件吗? Qt 在这里有一些关于该主题的示例:doc.qt.io/qt-5/qtcore-threads-waitconditions-example.html
  • 我认为这无济于事,因为问题的核心 - 立即丢弃或等到一些空闲空间出现 - 保持不变。有了等待条件,一旦某些特定部分在环形缓冲区中被释放,我就可以从 Producer 推送我的数据,但是,它不能解决丢弃/覆盖困境
猜你喜欢
  • 2011-05-11
  • 2011-06-19
  • 2018-02-05
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 2021-12-19
相关资源
最近更新 更多