【发布时间】:2021-11-16 06:26:34
【问题描述】:
我想为经典的Producer--Consumer 交互实现环形缓冲区。未来P 和C 都将实现为在数据处理任务期间运行的永久线程,GUI 将是第三个线程,仅用于显示实际数据并通过用户交互来协调数据处理的开始和停止。 C 能够完全处理所有传入的数据可能会很慢,但只有一点点和很短的时间。所以我只想分配几个P 的MTU 大小的环形缓冲区,但无论如何,如果C 处理现有数据的速度太慢,可以松散旧数据以支持新数据(覆盖政策)。
我在 Qt 帮助中阅读了QSemaphore 示例,并意识到通过使用信号量的获取和释放,我只能实现 discard 策略,因为获取队列中的指定块将阻塞,直到有没有可用空间。
是否有任何方法可以与QSemaphore 一起实施 overwrite 政策,或者我只需要去实施另一种方法?
【问题讨论】:
-
也许可以使用doc.qt.io/qt-5/qqueue.html 代替上面的方法,并且对于每个 enqueue(),通过弹出消费者仍未使用的项目来控制队列的最大大小。
-
你建议完全使用qqueue代替信号量还是仅仅作为数据存储的容器?如果你的意思是后者,我担心我不得不使用提供的库的环形缓冲区来存储数据。如果你的意思是前者,我应该如何实现同步?互斥方法是可能的方法之一,但它会阻塞并且会降低性能
-
队列的每次写入和读取都应该受到互斥锁保护。先试一试,再看看性能如何。
标签: multithreading qt