我在模式下使用QBuffer 。ReadWrite
一名工作人员QThread
将数据推送到缓冲区中,另一名工作人员QThread
从中读取。
QBuffer
保证线程安全还是我需要从互斥体中派生QBuffer
并添加互斥体?
我在模式下使用QBuffer 。ReadWrite
一名工作人员QThread
将数据推送到缓冲区中,另一名工作人员QThread
从中读取。
QBuffer
保证线程安全还是我需要从互斥体中派生QBuffer
并添加互斥体?
引用 Mark Summerfield 的书C++ GUI Programming with Qt 4:
Qt 的线程安全类包括 QMutex、QMutexLocker、QReadWriteLock、QReadLocker、QWriteLocker、QSemaphore、QThreadStorage 和 QWaitCondition。此外,部分 QThread API 和其他几个函数是线程安全的,特别是 QObject::connect()、QObject::disconnect()、QCoreApplication::postEvent() 和 QCoreApplication::removePostedEvents()。
Qt 期望您将围绕它的大多数类使用锁定机制。如果是,文档会说“所有函数都是线程安全的”,并且各个函数还将指定“是线程安全的”。
许多 Qt 类是可重入的,但它们不是线程安全的,因为使它们成为线程安全的会导致重复锁定和解锁 QMutex 的额外开销。例如,QString 是可重入的,但不是线程安全的。您可以同时从多个线程安全地访问 QString 的不同实例,但不能同时从多个线程安全地访问 QString 的同一实例(除非您自己使用 QMutex 保护访问)。
一些 Qt 类和函数是线程安全的。这些主要是线程相关的类(例如QMutex)和基本函数(例如QCoreApplication::postEvent())。
因为QBuffer
是QIODevice
我特别希望它不是线程安全的直接子类,但是有些容器类对于读访问是线程安全的,但需要锁定以进行写访问:
容器类是隐式共享的,它们是可重入的,它们针对速度、低内存消耗和最小的内联代码扩展进行了优化,从而产生更小的可执行文件。此外,在所有用于访问它们的线程将它们用作只读容器的情况下,它们是线程安全的。
QBuffer
不是线程之间通信的最佳方式,因为写入它会使缓冲区增长,但从它读取并不会在开始时删除数据。
您可以改为使用带有QByteArray
参数的信号/插槽,使用QLocalSocket
或编写从您自己派生的线程安全环形缓冲区类QIODevice
。
这扩展了 QIODevice,并且那里的文档指出 QIODevice 上的所有方法都是可重入的,但没有指定任何线程安全性。鉴于 QBuffer 没有提及更多内容,我希望 QBuffer 不是线程安全的。
Qt 中线程之间通信的最简单方法是将事件发布到另一个线程的事件队列中。这假设另一个线程旋转一个事件循环。它只需要定期在您通常检查新数据等的地方旋转它。
正如其他几位发帖人所指出的那样,QBuffer 是不适合这项工作的工具,无论线程安全问题如何。
Qt 中是否有进程内本地管道?描述了一个更适合预期目的的基于 QIODevice 的 FIFO 队列(尽管它不包括任何线程安全机制)