c++ - 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>
我的问题是 - 推送到队列的数据会通过引用或值复制吗?我一直在网上看到褒贬不一的评论。原因是我从另一个线程中将每个数据从队列中拉出,并且我想确保数据对于它来自的确切帧是准确的(如果通过引用存储,则不是来自某个当前帧) .
我似乎想不出可以测试一下的方法。任何想法将不胜感激 - 谢谢!
解决方案
通过使用new
,您创建了一个存在于堆上的数组。一个指针返回给你,它本质上就是你创建的数组在内存中的地址。通过将其传递到队列中来复制此地址不会创建数组的新副本。
因为您正在传递一个指向这个堆分配数据的指针,所以您需要小心何时delete
(调用时new
您应该始终delete
在完成数据后)。您不希望delete
在将该指针放入队列后立即对数组进行操作,否则当您尝试将指针从队列中弹出并使用它时,您可能会导致程序崩溃。
为避免此类问题,请确保将数据从队列中弹出的代码在完成后delete
成为数组。
我强烈建议通过使用 C++ 标准库中的智能指针类型(例如std::unique_ptr )来避免更多麻烦,而不是直接处理原始指针。
推荐阅读
- javascript - 与 TabBarIOS 一起使用时无法将组件正确传递给 NavigatorIOS
- java - Spring批处理JobRepository位置和缩放
- javascript - 在javascript / jquery中将2个数组与对象连接起来
- google-cloud-ml - Google ML Engine 是否支持贝叶斯超参数调整算法?
- html - 具有预先确定宽度的 Div 内具有背景颜色的 Div
- linux - 列出文件夹名称和文件上的特定行
- kotlin - 如果类型相同,则共享首选项覆盖元素
- javascript - Bootstrap Select2 不会在粘贴时触发选择事件,直到输入任何单词
- swift - 扩展 Optional 以检查它是 nil 还是 false
- javascript - 在构建时完全删除 react-hot-loader