Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
27 / 26 / 6
Регистрация: 22.03.2014
Сообщений: 277

Обращение к std::vector двумя потоками

25.07.2016, 12:46. Показов 1871. Ответов 5

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Товарищи единомышленники, есть задача которая заключается в следующем:
Есть объект который непрерывно, последовательно посылает данные (координаты точек x и y), эти данные так же записываются непрерывно и последовательно в массив (в моем случае std::vector). Получается кольцевая запись в массив. Данные непрерывно записываются, а когда достигнут конец массива то запись происходит с самого начала.
Есть второй поток которые считывает эти данные не постоянно, а только тогда когда первый поток заполнил массив до половины и начал записывать вторую половину. Второй поток ждет первого если тот не до конца записал порцию данных. При считывании вторым потоком своей порции данных происходит передача считанной информации в поток c GUI и отрисовка графика по полученным данным.
Вопрос как лучше реализовать данную задачу? Как производить синхронизацию чтения и записи, при условии того что запись должна постоянно и непрерывно осуществляться? В моей реализации есть моменты когда запись порции данных уже завершена и надо начинать запись следующей порции, а чтение на части массива которая должна сейчас перезаписываться еще не завершено?

PS: Читаю сейчас "Энтони Уильямс Параллельное программирование на С++ в действии 2012".
Мне достаточно небольшой наводки, подсказки как лучше организовать эту структуру данных.
Спасибо!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.07.2016, 12:46
Ответы с готовыми решениями:

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же числа, но не в виде строк, а в виде...

Обращение к полю элемента std::vector'a
Здравстуйте! :) Несильно знаком с STL пока, возникла проблемка. Есть класс: class DataBase { public: char Surname; int...

Обращение к элементам std::vector используя указатель
Доброго времени суток. В цикле обрабатывается большое количество элементов вектора. Прочел, что обращение через индекс в 2а раза...

5
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.07.2016, 12:50
Цитата Сообщение от Mikhail1990 Посмотреть сообщение
Вопрос как лучше реализовать данную задачу?
первый поток наполняет вектор как ему нужно. и посылает данные в поток гуя.
второй поток - не нужен.
1
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
25.07.2016, 12:51
Классический семафор.
2
27 / 26 / 6
Регистрация: 22.03.2014
Сообщений: 277
25.07.2016, 14:29  [ТС]
Ilot, ознакомился с концепцией семафора, возникает проблема в том что запись должна осуществляться непрерывно постоянно, и если началось чтение одной половины массива то оно должно продолжаться до конца этой читаемой половины, а запись продолжаться во второй половине постоянно непрерывно(в идеальных условиях). Если использовать семафор то будет потеря данных или при записи или при чтении (смотря чему дать больший приоритет при реализации). Не могли бы Вы разъяснить этот момент?

hoggy,
Цитата Сообщение от hoggy Посмотреть сообщение
первый поток наполняет вектор как ему нужно. и посылает данные в поток гуя.
второй поток - не нужен.
тут тоже просматривается эта проблема что один должен ждать другого.

Возможно я не так понял работу семафора? Прошу указать на ошибку, спасибо.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.07.2016, 14:35
Лучший ответ Сообщение было отмечено Mikhail1990 как решение

Решение

Цитата Сообщение от Mikhail1990 Посмотреть сообщение
тут тоже просматривается эта проблема что один должен ждать другого.
первый никого не ждет.
он готовит результат, и как только он готов - посылает посылку гую.

гуй никого не ждет.
как только его посылка готова - его уведомляют.

здесь нет места для синхронизаций.
нафиг не нужны ни мутексы, ни семафоры.
самое главное - не нужен второй поток.
1
27 / 26 / 6
Регистрация: 22.03.2014
Сообщений: 277
25.07.2016, 14:42  [ТС]
hoggy, ага, так понятней. Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.07.2016, 14:42
Помогаю со студенческими работами здесь

Как передать целочисленную матрицу типа std::vector<std::vector<int> > в функцию?
Здравствуйте. Почитал на форуме, но так и не понял что я делаю не так. Имеется двумерный вектор. Размера .. Нужно его передать в...

Вывести значения std::vector<std::vector<int*> >
Подскажите, как вывести значения? const size_t row = 3; const size_t col = 3; std::vector&lt;std::vector&lt;int*&gt; &gt; imatrix; ...

Как изменять размер std::vector<std::vector>?
Здравствуйте, как нужно изменять размер std::vector&lt;std::vector&gt; например: std::vector&lt;std::vector&lt;float&gt;&gt; data; ...

Std::vector<std::pair<std::vector<int>::iterator, std::vector<int>::iterator>
Вопрос по вектору. Допустим есть вектор, std::vector&lt;int&gt; vec; на каком - то этапе заполнения я ставлю закладку итератора, ...

Std::vector/QVector в классе или std::vector/QVector классов?
Доброе время суток! Собственно вопрос в самой теме, есть некий класс class WorkJornal { private: string manager; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru