我有以下代码,其中包括将一些数据从C++中的PPL(并发运行时)库推送到并发队列对象的过程。数据会不断更新(针对视频的每一帧),并按以下方式完成:
short* data;
data = new short[num_samples];
// data gets updated continuously
conQueue->push(data);
我正在初始化队列,如下所示:
conQueue = new concurrency::concurrent_queue<short*>;
具有以下库:
#include <ppl.h>
#include <concurrent_queue.h>
我的问题是-推送到队列的数据是否将通过引用或值复制?我一直在网上看到评论不一。原因是我正在从另一个线程中将每个数据从队列中拉出,并且我想确保该数据对于它来自的那个确切帧是准确的(如果通过引用存储,则不是来自某个当前帧) 。
我似乎想不出办法来测试一下。任何想法将不胜感激-谢谢!
最佳答案
通过使用new
,您创建了一个在堆上存在的数组。指针将返回给您,它实际上只是您创建的数组的内存中的地址。通过将其传递到队列中来创建该地址的副本将不会创建该数组的新副本。
因为您正在传递指向该堆分配的数据的指针,所以您在使用delete
时需要格外小心(在调用new
时,一旦处理完数据,您应该始终使用delete
)。您不希望在将指针放入队列后直接对数组进行delete
编码,否则当您尝试将指针从队列中弹出并使用它时,可能会导致程序崩溃。
为避免此类问题,请确保完成该操作后,由delete
将该数组中的数据弹出队列的代码。
我强烈建议通过使用C++标准库中的智能指针类型(例如std::unique_ptr)来避免更多的麻烦,而不是直接处理原始指针。
关于c++ - C++并发队列按引用或值进行推送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59689889/