首页 > 解决方案 > C++ 并发队列按引用或值推送

问题描述

我有以下代码,其中包括我将一些数据从 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>

我的问题是 - 推送到队列的数据会通过引用或值复制吗?我一直在网上看到褒贬不一的评论。原因是我从另一个线程中将每个数据从队列中拉出,并且我想确保数据对于它来自的确切帧是准确的(如果通过引用存储,则不是来自某个当前帧) .

我似乎想不出可以测试一下的方法。任何想法将不胜感激 - 谢谢!

标签: c++multithreadingqueue

解决方案


通过使用new,您创建了一个存在于堆上的数组。一个指针返回给你,它本质上就是你创建的数组在内存中的地址。通过将其传递到队列中来复制此地址不会创建数组的新副本。

因为您正在传递一个指向这个堆分配数据的指针,所以您需要小心何时delete(调用时new您应该始终delete在完成数据后)。您不希望delete在将该指针放入队列后立即对数组进行操作,否则当您尝试将指针从队列中弹出并使用它时,您可能会导致程序崩溃。

为避免此类问题,请确保将数据从队列中弹出的代码在完成后delete成为数组。

我强烈建议通过使用 C++ 标准库中的智能指针类型(例如std::unique_ptr )来避免更多麻烦,而不是直接处理原始指针。


推荐阅读