【发布时间】:2012-12-13 17:28:55
【问题描述】:
我在ReadWrite 模式下使用QBuffer。一名工作人员 QThread 将数据推送到缓冲区中,另一名工作人员 QThread 从中读取数据。
QBuffer 是否保证线程安全,还是我需要从 QBuffer 派生并添加互斥体?
【问题讨论】:
-
您只有一个 pos(),因此您需要在单个临界区中进行 seek() 和 read() 或 write()。此外,如果缓冲区为空/满,read()/write() 可能应该阻塞?这与 QBuffer/QIODevice 语义完全不同,值得拥有自己的类。
-
QBuffer 不是管道。它根本不适合您使用,线程与否!你使用它的方式最终会耗尽内存,因为缓冲区只能增长,不能缩小。如果你想要一个呈现两个 QIODevice 的类,比如管道的末端,你需要创建你自己的。您也可以重复使用
QRingBuffer(#include <private/qringbuffer_p.h>),但必须对它的访问进行互斥保护。 -
您真正要查找的内容称为lock-free queue - 查看最受好评的答案,它有很好的参考资料。
标签: c++ qt thread-safety