QByteArray通过QueuedConnection通过值发出并连接,并附加到竞争条件吗?

问题描述 投票:0回答:1

[我有一个信号newData(int type, QByteArray data)作为queueConnection连接到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为implicitly shared,但数据应在写时复制。 Qt文档特别指出

请注意,原子引用计数不能保证线程安全。在线程之间共享隐式共享类的实例时,应使用适当的锁定。这是对所有可共享或不可共享的可重入类的相同要求。但是,原子引用计数确实可以确保在隐式共享类的自己的本地实例上工作的线程是安全的。我们建议使用信号和插槽在线程之间传递数据,因为无需任何显式锁定即可完成此操作。

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

c++ multithreading qt qt-signals qbytearray
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.