某个场景是需要频繁的调用系统时间,但是精度要求不那么高(误差在 500ms - 800ms 左右吧)。网上有人提出 TimeThread 的设计即单起一个后台线程维护一个时间变量,用的时候直接获取这个时间变量就可以了。我不太确定这种方案的可行性,于是自己尝试实现了下,下面是大致实现:
.h
class TimeThread
{
private:
TimeThread();
~TimeThread();
public:
inline ::std::time_t getCurrentTime() const
{
return currentTime_;
}
private:
void updateCurrentTime();
private:
::std::atomic<bool> running_ { false };
::std::time_t currentTime_ { 0 };
::std::thread timeThread_ {};
};
.cpp
namespace
{
constexpr uint32_t MicrosecondsPerSecond = 1000000U;
struct timeval tmV {};
}
TimeThread::TimeThread() : running_(true)
{
::gettimeofday(&tmV, nullptr);
currentTime_ = (tmV.tv_sec * MicrosecondsPerSecond) + tmV.tv_usec;
timeThread_ = ::std::thread(&TimeThread::updateCurrentTime, this);
}
TimeThread::~TimeThread()
{
running_ = false;
if (timeThread_.joinable())
{
timeThread_.join();
}
}
void TimeThread::updateCurrentTime()
{
while (running_)
{
::gettimeofday(&tmV, nullptr);
currentTime_ = (tmV.tv_sec * MicrosecondsPerSecond) + tmV.tv_usec;
::std::this_thread::sleep_for(::std::chrono::milliseconds(50));
}
}
还有我把这个类作为单例供其他需要的模块使用是否可行? 求各位大牛帮忙指出方案和代码的缺陷,感谢!
1
cppc 2022-04-30 20:38:50 +08:00
稳妥期间,可以在 loop 里检查一下上一次保存的时间和当前时间差了多少,偏离过大起码也得记录个日志之类
|