27 / 26 / 6
Регистрация: 22.03.2014
Сообщений: 277
|
|
1 | |
Обращение к std::vector двумя потоками25.07.2016, 12:46. Показов 1617. Ответов 5
Доброго времени суток! Товарищи единомышленники, есть задача которая заключается в следующем:
Есть объект который непрерывно, последовательно посылает данные (координаты точек x и y), эти данные так же записываются непрерывно и последовательно в массив (в моем случае std::vector). Получается кольцевая запись в массив. Данные непрерывно записываются, а когда достигнут конец массива то запись происходит с самого начала. Есть второй поток которые считывает эти данные не постоянно, а только тогда когда первый поток заполнил массив до половины и начал записывать вторую половину. Второй поток ждет первого если тот не до конца записал порцию данных. При считывании вторым потоком своей порции данных происходит передача считанной информации в поток c GUI и отрисовка графика по полученным данным. Вопрос как лучше реализовать данную задачу? Как производить синхронизацию чтения и записи, при условии того что запись должна постоянно и непрерывно осуществляться? В моей реализации есть моменты когда запись порции данных уже завершена и надо начинать запись следующей порции, а чтение на части массива которая должна сейчас перезаписываться еще не завершено? PS: Читаю сейчас "Энтони Уильямс Параллельное программирование на С++ в действии 2012". Мне достаточно небольшой наводки, подсказки как лучше организовать эту структуру данных. Спасибо!
0
|
25.07.2016, 12:46 | |
Ответы с готовыми решениями:
5
На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами Обращение к полю элемента std::vector'a Обращение к элементам std::vector используя указатель Как передать целочисленную матрицу типа std::vector<std::vector<int> > в функцию? |
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
25.07.2016, 12:50 | 2 |
первый поток наполняет вектор как ему нужно. и посылает данные в поток гуя.
второй поток - не нужен.
1
|
27 / 26 / 6
Регистрация: 22.03.2014
Сообщений: 277
|
|
25.07.2016, 14:29 [ТС] | 4 |
Ilot, ознакомился с концепцией семафора, возникает проблема в том что запись должна осуществляться непрерывно постоянно, и если началось чтение одной половины массива то оно должно продолжаться до конца этой читаемой половины, а запись продолжаться во второй половине постоянно непрерывно(в идеальных условиях). Если использовать семафор то будет потеря данных или при записи или при чтении (смотря чему дать больший приоритет при реализации). Не могли бы Вы разъяснить этот момент?
hoggy, тут тоже просматривается эта проблема что один должен ждать другого. Возможно я не так понял работу семафора? Прошу указать на ошибку, спасибо.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
25.07.2016, 14:35 | 5 |
Сообщение было отмечено Mikhail1990 как решение
Решение
первый никого не ждет.
он готовит результат, и как только он готов - посылает посылку гую. гуй никого не ждет. как только его посылка готова - его уведомляют. здесь нет места для синхронизаций. нафиг не нужны ни мутексы, ни семафоры. самое главное - не нужен второй поток.
1
|
27 / 26 / 6
Регистрация: 22.03.2014
Сообщений: 277
|
|
25.07.2016, 14:42 [ТС] | 6 |
hoggy, ага, так понятней. Спасибо.
0
|
25.07.2016, 14:42 | |
25.07.2016, 14:42 | |
Помогаю со студенческими работами здесь
6
Вывести значения std::vector<std::vector<int*> > Как изменять размер std::vector<std::vector>? Std::vector<std::pair<std::vector<int>::iterator, std::vector<int>::iterator> Std::vector/QVector в классе или std::vector/QVector классов? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |