/* * ShadowGuard.h * * Created on: 10 мая 2017 г. * Author: titov */ #ifndef SOURCES_COMMON_SHADOWGUARD_H_ #define SOURCES_COMMON_SHADOWGUARD_H_ //!Класс для передачи данных между потоками. /*!Класс гарантирует безопасную передачу данных в случае если функция update не будет прервана функцией operator =. * */ template class ShadowGuard : public V { private: V shadow_value; bool upd; public: ShadowGuard(const V &); //!Безопасное присваивание в прерываемом потоке. void operator=(const V & new_value); //!Безопасное обновление в прерывающем потоке. void update(); }; template inline void ShadowGuard::operator =(const V & new_value) { upd = false; shadow_value = new_value; upd = true; } template inline ShadowGuard::ShadowGuard(const V & rv) : V(rv), shadow_value(rv), upd(false) {} template inline void ShadowGuard::update() { if(upd) { volatile V new_value = shadow_value; // do { // new_value = shadow_value; // } while( new_value != shadow_value ); *static_cast(this) = shadow_value; upd = false; } } template V read_from_fast( volatile const V * value ) { V * fast_value = const_cast(value); V temp(*fast_value); do { temp = *fast_value; } while( temp != *fast_value ); return temp; } #endif /* SOURCES_COMMON_SHADOWGUARD_H_ */