Я пытаюсь распределить поток данных по клиентам многопоточного экземпляра сервера, клиентские потоки должны только читать.Это означает, что у меня есть поток, из которого поступают данные, и все остальные потоки должны прочитать эти данные (им больше не нужно их изменять), чтобы они могли отправлять данные клиентам.Для очереди я использую это: https://blog.chrisd.info/a-simple-thread-safe-queue-for-use-in-multi-threaded-c-applications/ шаблон класса.
Мой подход заключается в создании списка очередей и отправке данных во все из них.Поэтому я могу прочитать их в клиентском потоке (одна очередь для одного клиентского потока).
Создание списка:
ThreadSafeQueue<std::string> sq[50];
Постановка данных во все очереди:
for (i=0; i<50; i++)
{
sq[i].enqueue(buffer);
}
Удаление данных из одной очереди на поток:
size = sq[local_thread_count].dequeue(res);
Здесь вы можете найти весь код src здесь
Каждый клиентский поток имеет posixпоток (clientHandler
) , который не делает ничего, кроме удаления из очереди и последующей отправки информации клиенту, информация помещается в очередь другим pthread (gpsDataStream
) , который считывает информацию изпоследовательный интерфейс, а затем ставит его во все очереди.Все потоки создаются в основной функции :
Переменная local_thread_count
увеличивается на единицу и передается в качестве параметра при создании потока клиента.Он существует, поэтому каждый поток удаляется из другой очереди.
Он частично работает с одним клиентским потоком, но при добавлении второго первый прекращает прием данных, и только новый может удалить данные из очереди.Этого не должно быть, поскольку они используют разные очереди.