V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Sponsored by
LinkedIn
不坐班的神仙工作 · 去任何你想去的地方远程,赚一线城市的工资
2000 个不用出门 Social 的全球远程工作,帮助 V2EX 的小伙伴开启全新的工作方式。
Promoted by LinkedIn
guang19
V2EX  ›  程序员

我这样实现 Time Thread 是否可行?

  •  
  •   guang19 · 150 天前 · 970 次点击
    这是一个创建于 150 天前的主题,其中的信息可能已经有所发展或是发生改变。

    某个场景是需要频繁的调用系统时间,但是精度要求不那么高(误差在 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));
    			}
    		}
    

    还有我把这个类作为单例供其他需要的模块使用是否可行? 求各位大牛帮忙指出方案和代码的缺陷,感谢!

    2 条回复    2022-04-30 23:21:16 +08:00
    cppc
        1
    cppc  
       150 天前
    稳妥期间,可以在 loop 里检查一下上一次保存的时间和当前时间差了多少,偏离过大起码也得记录个日志之类
    guang19
        2
    guang19  
    OP
       150 天前
    @cppc 好的,感谢。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1140 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 50ms · UTC 21:30 · PVG 05:30 · LAX 14:30 · JFK 17:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.