timedlockdata.hpp 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. //
  2. // Created by zx on 22-12-1.
  3. //
  4. #pragma once
  5. #include <chrono>
  6. #include <mutex>
  7. template <typename T>
  8. class TimedLockData {
  9. public:
  10. TimedLockData();
  11. void reset(const T& tdata,double timeout=0.1);
  12. bool timeout();
  13. T Get();
  14. protected:
  15. T data_;
  16. std::chrono::steady_clock::time_point tp_;
  17. std::mutex mutex_;
  18. double timeout_;
  19. };
  20. template <typename T>
  21. TimedLockData<T>::TimedLockData()
  22. {
  23. timeout_=0.1;
  24. }
  25. template <typename T>
  26. void TimedLockData<T>::reset(const T& tdata,double timeout)
  27. {
  28. std::lock_guard<std::mutex> lck (mutex_);
  29. data_=tdata;
  30. timeout_=timeout;
  31. tp_=std::chrono::steady_clock::now();
  32. }
  33. template <typename T>
  34. bool TimedLockData<T>::timeout()
  35. {
  36. auto now=std::chrono::steady_clock::now();
  37. auto duration = std::chrono::duration_cast<std::chrono::microseconds>(now - tp_);
  38. double time = double(duration.count()) * std::chrono::microseconds::period::num / std::chrono::microseconds::period::den;
  39. return time>timeout_;
  40. }
  41. template <typename T>
  42. T TimedLockData<T>::Get()
  43. {
  44. std::lock_guard<std::mutex> lck (mutex_);
  45. return data_;
  46. }