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

Система синхронизации данных по определенному такту

10.08.2017, 12:27. Показов 1179. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Меня интересует различные подходы к проектированию системы для синхронизации данных в многопоточном приложении.

Ситуация следующая:
Есть СИСТЕМЫ , которые работают в своем ритме и в своем потоке. Системы максимально независимы, но в есть некоторый контроллер, который в определенное время ждет завершение всех потоков, чтобы синхронизировать данные систем.
Бывают ситуации, когда одной системе необходимо узнать данные другой системы и сделать их локальную копию, чтобы на следующем такте каким то образом обработать.
Например: Система рендеринга в момент синхронизации просит данные от системы физики, чтобы на следующем такте их отрендерить.
Так как все в разных потоках, то ссылаться напрямую - не очень хорошо. Нужна копия.
Меня интересует каким образом можно реализовать синхронизацию.
Вот, к примеру, система физике генерирует событие - я поменялась. Рендер подписывается на это событие, НО сигнал не говорит, что конкретно поменялось. А копировать все данные неэффективно. Главный мой вопрос - каким образом сделать такую систему, чтобы синхронизация происходила без полного копирования.

Что пришло в голову?
1) Система генерирует не общий сигнал о своем изменении, а куча сигналов, которые покажут, что поменялось. (Но это не очень удобно, так как подписываться на кучу сигналов - такое себе удовольствие)

2) Система, при изменении данных генерирует событие и передает в него объект уведомления.
Что-то типа:
C++
1
2
3
4
5
6
7
8
9
template<typename Base>
class Notification
{
public:
     void run(Base *object)
     {
          //Изменяю в object-е только то, что надо
     }
}
С примером физики и рендерера будет примерно следующее:
1) Физика создает уведомление и сохраняет туда все действия с помощью std::function... (ну или что-то из этого рода)
2) Генерирует событие с этим уведомлением.
3) Контроллер изменения оповещает рендерер об изменении физики и рендерер делает notification.run(this);

Даже не знаю, что еще можно придумать. Пока получаются велосипеда
Подскажите, какие есть варианты?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.08.2017, 12:27
Ответы с готовыми решениями:

Firefox и новая система синхронизации
народ,переустановил систему, ставлю firefox последнюю а там оказывается новая система синхронизации. вопрос: как вернуть данные из старой...

Как по 1 такту выработать данные на выходах регистра mc74hc1
Доброго времени суток, подскажите, можно ли сделать так чтобы по фронтальному импульсу (с частотой 9 МГц), 4 последовательно подключенных...

Механизм синхронизации данных
Подскажите пожалуйста как сделать синхронизацию Существуют две разные БД, в которых ведутся одинаковые данные, например состав изделий....

3
Полярный
 Аватар для dimcoder
477 / 449 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
10.08.2017, 12:42
Цитата Сообщение от Kertis138 Посмотреть сообщение
Бывают ситуации, когда одной системе необходимо узнать данные другой системы и сделать их локальную копию, чтобы на следующем такте каким то образом обработать.
Цитата Сообщение от Kertis138 Посмотреть сообщение
Так как все в разных потоках, то ссылаться напрямую - не очень хорошо. Нужна копия.
Ссылаться напрямую - весьма себе хорошо. Но нужна гарантия что эти данные не изменятся во время ссылки. Гарантию можно дать использованием мьютексов. Если процесс при котором нужно ссылаться долгий, а модулю физики нужно работать, и если скопировать быстрее, что зависит от объема данных, то лучше скопировать. Но опять же - при копировании нужная гарантия что данные не изменятся.
Цитата Сообщение от Kertis138 Посмотреть сообщение
Главный мой вопрос - каким образом сделать такую систему, чтобы синхронизация происходила без полного копирования.
Ну так нужно анализировать систему, смотреть какие данные лучше скопировать (то есть объем которых не велик, а обращение к этим данных происходит в течение длительного времени) или не копировать (объема очень много, и все можно просмотреть в небольшой промежуток времени, после которого эти данные нужны не будут).

А лучше - подумайте, не оптимизируете ли вы преждевременно.
1
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 342
10.08.2017, 13:08  [ТС]
Цитата Сообщение от dimcoder Посмотреть сообщение
А лучше - подумайте, не оптимизируете ли вы преждевременно.
Даже если не оптимизировать, то какой вариант выбрать?
Я не могу во время работы рендерера ссылаться на физику, так как физика не завершила работу (Часть единого объекта передвинулась, а другая нет - что недопустимо для рендеринга). Поэтому есть специально отведенное время для синхронизации, когда все системы гарантированно завершили работу. Но а что делать рендереру в этот момент, если не копировать? Без копирования - это опять же ссылка во время работы другой системы - что недопустимо из-за вышеописанной проблемы.
0
Полярный
 Аватар для dimcoder
477 / 449 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
10.08.2017, 14:51
Лучший ответ Сообщение было отмечено Kertis138 как решение

Решение

Цитата Сообщение от Kertis138 Посмотреть сообщение
Поэтому есть специально отведенное время для синхронизации, когда все системы гарантированно завершили работу. Но а что делать рендереру в этот момент, если не копировать?
Для того что бы ответить на этот вопрос, нужно сперва понять вот что: во время работы физического движка, может ли даваться гарантия что какой либо объект Х полность обработан этим движком ДО того как физ. движок закончил работу чтобы рендерер мог посмотреть на этот объект? Если да, то это повод для оптимизации - передавать рендереру объект сразу после того как он был обработан. Если нет, то очевидно нужно копировать все во время синхронизации.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.08.2017, 14:51
Помогаю со студенческими работами здесь

С++ Защита данных при синхронизации
Как можно защитить данные в CreateThread (создание потока) У меня есть в программе чтение данных (разрешения создаваемого окна и её...

Синхронизации данных 1С с MS SQL сервером
Добрый день! Я в 1С мало что понимаю, поэтому вопрос: каким образом можно синхронизировать данные между 1С и sql сервером? Например...

Мобильное приложение. Реализация синхронизации данных.
Добрый день Пытаюсь сделать свою конфигурацию мобильную на андройд , Возник вопрос как сделать обмен планшета с ПК через интернет ?...

Какие есть способы синхронизации PM2 некоторых данных?
Просто например счетчик на количество запросов, var express = require('express'); var app = express(); app.listen(9999, () =&gt; { ...

В синхронизации данных через универсальный формат не регистрируются объекты
Добрый день. После обновления релиза конфигурации БП 3 (до 3.0.64.54) перестал работать обмен через &quot;синхронизация данных...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru