Я не уверен, если это вопрос касательно техники или дизайна, но я открыт для предложений.
Проблема: я хочу создать слой абстракции между источниками данных (датчиками) и потребителями,Идея состоит в том, что потребители «знают» только интерфейсы (абстрактный базовый класс) разных типов датчиков.Каждый из этих типов датчиков обычно состоит из нескольких отдельных значений, которые имеют свои собственные методы получения.
В качестве примера я буду использовать упрощенный датчик GPS.
class IGpsSensor {
public:
virtual float getLongitude() = 0;
virtual float getLatitude() = 0;
virtual float getElevation() = 0;
// Deviations
virtual float getLongitudeDev() = 0;
virtual float getLatitudeDev() = 0;
virtual float getElevationDev() = 0;
virtual int getNumOfSatellites() = 0;
};
Поскольку обновления датчика выполняются другим потоком (подробности зависят от реализации интерфейса), синхронизацияgetters, а также методы обновления кажутся разумным подходом для обеспечения согласованности.
Пока все хорошо.В большинстве случаев этого уровня синхронизации должно быть достаточно.Однако иногда может потребоваться получить более одного значения (с последовательными вызовами getXXX ()) и убедиться, что между ними не происходит никаких обновлений.Нужно это или нет (и какие ценности важны), зависит от потребителя.
Придерживаясь примера, во многих случаях важно знать только долготу и широту (но, надеюсь, оба имеют отношение к одному и тому же обновлению ()).Я допускаю, что это можно сделать, сгруппировав их в класс или структуру "Position".Но потребитель может также использовать датчик для более сложного алгоритма и также требует отклонения.
Теперь мне было интересно, что было бы правильным способом сделать это.
Решения, о которых я мог подумать:
Сгруппировать все возможные значения в структуру (или класс) и добавить дополнительный (синхронизированный) метод получения, возвращающий копии всех значений одновременно- мне кажется, что это лишние накладные расходы, если требуется только 2 или 3 значения из 10.
Добавить метод, возвращающий ссылку на мьютекс, используемый в источнике данныхразрешить блокировку потребителем - это не похоже на «хороший дизайн».А поскольку геттеры уже синхронизированы, использование рекурсивного мьютекса обязательно.Тем не менее, я предполагаю, что есть несколько читателей, но только один писатель, и поэтому я бы предпочел использовать здесь общий мьютекс.
Спасибо за вашу помощь.