Потокобезопасное время для выравнивания данных, собранных в нескольких потоках — работает ли QElapsedTimer?

Я работаю над приложением (c++), которое использует несколько типов оборудования для одновременного сбора данных разных типов. Обычный шаблон использования состоит в том, чтобы запускать различные интерфейсы для этих устройств (отслеживание взгляда, отслеживание движения, визуализация и т. д.) каждый в своем собственном потоке, чтобы они как можно меньше мешали друг другу. Мне не нужна гарантия сверхточной синхронизации времени фактического выполнения потоков, для чего, как я понимаю, потребуются аппаратные таймеры. Однако я хочу, чтобы потоки могли запрашивать какой-либо центральный таймер, который они могут периодически использовать для добавления временных меток к собранным данным, чтобы данные можно было (полуточно) выровнять. позже на анализ. Для этой цели подходит миллисекундная точность.

Приложение использует Qt для графического интерфейса, поэтому я подумал, что QElapsedTimer будет потенциальное решение. Однако в документации указано, что все методы являются реентерабельными, а не потоковыми. -безопасно. Правильно ли я понимаю, что для этого требуется уникальный объект QElapsedTimer для каждого потока, который хочет использовать этот тип функций синхронизации? Если это так, мой подход состоял бы в том, чтобы потребовать от каждого потока инициализировать синхронизацию в блокирующей функции (выполняемой в основном потоке). Инициализация будет включать создание объекта-оболочки, который объединяет таймер + смещение от «основного» таймера, так что любые/все созданные таймеры «синхронизируются» с основным таймером. Это будет сделано в основном потоке, чтобы получить смещение от исходного таймера, не поддерживающего многопоточность.

Является ли это разумным подходом или есть лучший «стандартный» подход (дизайн-шаблон), который я должен использовать вместо этого? Или есть другая библиотека, которая лучше подходит для моих целей? В настоящее время я работаю над Windows (7 и XP), но в конечном итоге приложение должно стать кросс-платформенным.


person tmpearce    schedule 26.03.2012    source источник


Ответы (2)


В Qt у вас есть удобные классы, такие как QMutexLocker, для выполнения синхронных вызовов. Таким образом, вы можете использовать QMutexLocker вместе с QMutex, чтобы пометить функцию как потокобезопасную, а затем вы можете без проблем использовать QElapsedTimer в потоках.

person milot    schedule 26.03.2012
comment
Спасибо ... искал способ избежать блокировки мьютекса каждый раз, когда вызывается функция, но это может быть лучшим подходом. На данный момент я реализую это таким образом, мне может потребоваться изменить что-то похожее на мое первоначальное предложение, если это окажется более дорогим, чтобы сделать это таким способом с мьютексом. - person tmpearce; 27.03.2012

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

person Luca Carlon    schedule 26.03.2012