C ++ одновременная выдача очереди по ссылке или значению - PullRequest
0 голосов
/ 11 января 2020

У меня есть следующий код, который состоит в том, что я помещаю некоторые данные в объект параллельной очереди из библиотеки PPL (Concurrent Runtime) в C ++. Данные обновляются постоянно (для каждого кадра видео) и выполняются следующим образом:

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>

Мой вопрос - будут ли данные, которые помещаются в очередь, копироваться по ссылке или значению? Я продолжаю видеть смешанные комментарии онлайн. Причина в том, что я вытаскиваю все данные из очереди из другого потока, и я хочу убедиться, что данные являются точными для того точного кадра, из которого они были (а не из какого-то текущего кадра, если они хранятся по ссылке) .

Кажется, я не могу придумать, как это проверить, чтобы увидеть. Любые идеи будут с благодарностью - спасибо!

1 Ответ

0 голосов
/ 13 января 2020

Используя new, вы создали массив, существующий в куче. Вам возвращается указатель, который по сути является просто адресом в памяти созданного вами массива. Создание копии этого адреса путем передачи его в очередь не приведет к созданию новой копии массива.

Поскольку вы передаете указатель на эти данные, выделенные в куче, вам нужно быть осторожным, когда Вы delete (при вызове new вы всегда должны delete, как только вы закончите с данными). Вы не захотите delete массив сразу после помещения этого указателя в очередь, или вы можете заставить вашу программу обработать sh, когда вы попытаетесь извлечь указатель из очереди и использовать его.

Чтобы избежать такого рода проблем, убедитесь, что это код, который извлекает данные из очереди, delete массива, как только он будет сделан.

Я настоятельно рекомендую избегать этой проблемы, поскольку использование типов интеллектуальных указателей в стандартной библиотеке C ++, таких как std :: unique_ptr , вместо непосредственной обработки необработанных указателей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...