C++ 是否有任何STL函数使用wallclock time而不是“等待”来等待;机器唤醒“;时间

C++ 是否有任何STL函数使用wallclock time而不是“等待”来等待;机器唤醒“;时间,c++,stl,C++,Stl,我试图找到一种方法来等待信号或最长持续时间,这样的持续时间就是挂钟时间,而不是机器醒着的时间。例如,对于以下事件顺序: 调用wait()函数的时间最长为24小时 12小时过去 机器停止运转 12小时过去 机器从睡眠中醒来 我希望wait()调用在进程运行时立即返回,因为wallclock时间已经过去了24小时。我尝试过使用std::condition\u变量::wait\u till,但这会使用机器唤醒时间。我还尝试了windows上的WaitForSingleObject()和mac上的pth

我试图找到一种方法来等待信号或最长持续时间,这样的持续时间就是挂钟时间,而不是机器醒着的时间。例如,对于以下事件顺序:

  • 调用wait()函数的时间最长为24小时
  • 12小时过去
  • 机器停止运转
  • 12小时过去
  • 机器从睡眠中醒来
  • 我希望wait()调用在进程运行时立即返回,因为wallclock时间已经过去了24小时。我尝试过使用std::condition\u变量::wait\u till,但这会使用机器唤醒时间。我还尝试了windows上的WaitForSingleObject()和mac上的pthread_cond_timedwait(),但都没有成功。如果可能的话,我更喜欢跨平台的(例如STL)。作为备份,它看起来像windows的SetThreadpoolTimer()和mac上的dispatch_after()(使用dispatch_walltime())可以工作,但我当然更喜欢单一实现。有人知道吗

    谢谢

    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        condition_variable cv;
        mutex m;
        unique_lock<mutex> lock(m);
        auto start = chrono::steady_clock::now();
        cv_status result = cv.wait_until(lock, start + chrono::minutes(5));
        //put computer to sleep here for 5 minutes, should wake up immediately
        if (result == cv_status::timeout)
        {
            auto end = chrono::steady_clock::now();
            chrono::duration<double> diff = end - start;
            cerr << "wait duration: " << diff.count() << " seconds\n";
        }
    
        return 0;
    }
    
    使用名称空间std;
    int _tmain(int argc,_TCHAR*argv[]
    {
    条件变量cv;
    互斥m;
    唯一锁(m);
    自动启动=计时::稳定时钟::现在();
    cv_状态结果=cv.等待(锁定、启动+计时::分钟(5));
    //把电脑放在这里睡觉5分钟,应该马上醒来
    如果(结果==cv_状态::超时)
    {
    自动结束=计时::稳定时钟::现在();
    时间::持续时间差=结束-开始;
    
    cerr
    等待_,直到
    需要一个
    时间点
    。该时间点根据时钟类型进行模板化。墙时间与CPU时间取决于您选择的时钟。信任墙时间通常不可靠,因为计算机可能会谎报当前时间(例如,用户可以将计算机的日期更改为过去的日期)。CPU时间是基于CPU本身循环频率的计数器。我认为唯一可能的“标准”解决方案是等待一段时间,醒来,检查系统时钟,然后继续等待,如果你没有收到信号,而且从开始时间到现在还没有24小时。根据平台和实现的不同,其他任何东西都可能工作,也可能不工作。@JerryCoffin有趣的是……stl中有标准的walltime时钟吗?我做了一点of搜索,但找不到任何东西。@jxh不幸的是,我需要使用wallclock时间,因为在这种情况下,滴答计数不起作用。我们有一些东西每24小时过期一次。如果计算机处于睡眠状态,我们需要知道离24小时标记还有多长时间。当然,我们可以监听电源事件并关闭它,但在我们的设计中,这是非常重要的非常奇怪。就架构而言,拥有一个基于墙时间而不是滴答数的事件API更合适。