27 / 26 / 6
Регистрация: 22.03.2014
Сообщений: 277
1

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

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

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

PS: Читаю сейчас "Энтони Уильямс Параллельное программирование на С++ в действии 2012".
Мне достаточно небольшой наводки, подсказки как лучше организовать эту структуру данных.
Спасибо!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.07.2016, 12:46
Ответы с готовыми решениями:

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

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

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

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

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

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

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

Решение

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

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

здесь нет места для синхронизаций.
нафиг не нужны ни мутексы, ни семафоры.
самое главное - не нужен второй поток.
1
27 / 26 / 6
Регистрация: 22.03.2014
Сообщений: 277
25.07.2016, 14:42  [ТС] 6
hoggy, ага, так понятней. Спасибо.
0
25.07.2016, 14:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.07.2016, 14:42
Помогаю со студенческими работами здесь

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

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

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 {...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru