Сделать поток данных из потока доступным для чтения для всех других потоков - PullRequest
0 голосов
/ 16 сентября 2018

Я должен распределить поток данных по клиентам многопоточного экземпляра сервера, клиентские потоки должны только читать. Это означает, что у меня есть поток, из которого поступают данные, и все остальные потоки должны прочитать эти данные (им больше не нужно их изменять), чтобы они могли отправлять данные клиентам.

Я попробовал поточно-ориентированную очередь (https://blog.chrisd.info/a-simple-thread-safe-queue-for-use-in-multi-threaded-c-applications/), но как только я попробовал ее с более чем одним клиентом, только второй или новый получил данные.

Как мне решить проблему? Существуют ли какие-либо потокобезопасные очереди, которые можно использовать в нескольких потоках?

Luick

1 Ответ

0 голосов
/ 16 сентября 2018

Как вы уже описали, обычная семантика очереди не будет работать, поскольку вы действительно хотите вытолкнуть элементы, когда все потоки получили их, а не при первом доступе.Таким образом, у вас есть несколько вариантов:

  • Поддерживать очередь для каждого потока клиента, и поток производителя всегда помещает данные в каждый из потоков клиента.Оборачивая данные в std::shared_ptr, вы можете уменьшить накладные расходы памяти и создать семантику, в которой данные уничтожаются, когда с ним завершает работу последний клиент.
  • Имеют одну очередь, но несколько хвостовых указателей для каждого потока.Хотя это может стать сложным с точки зрения обработки потоков по мере их появления / завершения.Но вы не указали, какие ограничения существуют в вашей системе - фиксированный или динамический счетчик потоков.
...