QByteArray 通过队列连接按值发出并连接并附加到竞争条件?



我有一个信号newData(int type, QByteArray data)作为队列连接到slotNewData(int type, QByteArray data),然后我发出两个数据回调,如下所示

emit newData(OEI_DataParserV2_base::OEI_CBT_DOUBLE, dp_v2_databuff_);
uint32_t sec;
uint32_t usec;
dataParserV2->getDataTimestamp(sec,usec);
dp_v2_databuff_.append(reinterpret_cast<const char*>(&usec), sizeof(usec));
dp_v2_databuff_.append(reinterpret_cast<const char*>(&sec), sizeof(sec));
emit newData(OEI_DataParserV2_base::OEI_CBT_TIMESTAMP_DOUBLE, dp_v2_databuff_);

我希望我的插槽接收没有附加时间戳的数据,然后接收带有附加时间戳的数据。但是,我有时会看到数据返回带有额外附加时间戳的OEI_CBT_DOUBLE类型。我看到 QByteArray 是隐式共享的,但数据应该在写入时复制。Qt文档特别指出

请注意,原子引用计数不能保证线程安全。在线程之间共享隐式共享类的实例时,应使用正确的锁定。这与所有可重入类(无论是否共享(的要求相同。但是,原子引用计数确实保证了在隐式共享类的本地实例上工作的独立线程是安全的。我们建议使用信号和槽在线程之间传递数据,因为这可以在不需要任何显式锁定的情况下完成。

QByteArray::append 不应该创建我的dp_v2_databuff_的深层副本吗?我应该通过 const ref 还是按值通过队列连接传递我的 QByteArrays?

因此,引起此讨论的错误现已解决。QByteArray 在此代码的每次迭代中都会附加到此代码中,因此在粘在代码末尾的时间戳会越来越大。

最新更新