C++ 为什么boost::timed_在使用绝对时间调用时会永远阻塞?

C++ 为什么boost::timed_在使用绝对时间调用时会永远阻塞?,c++,boost,condition-variable,C++,Boost,Condition Variable,我正在试图了解如何使用定时等待。我只找到了几个例子(和),当用绝对时间调用它时,我遇到了一个问题。下面的代码是一个简化的示例,实际上这一切都发生在一个类中,因此我认为手动检查谓词会更容易,而不必使用一些绑定并将其传递给timed\u wait #include <boost/date_time/posix_time/posix_time.hpp> #include <boost/thread.hpp> #include <iostream> bool don

我正在试图了解如何使用
定时等待
。我只找到了几个例子(和),当用绝对时间调用它时,我遇到了一个问题。下面的代码是一个简化的示例,实际上这一切都发生在一个类中,因此我认为手动检查谓词会更容易,而不必使用一些绑定并将其传递给
timed\u wait

#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/thread.hpp>
#include <iostream>

bool done = false;
boost::mutex mutex;
boost::thread waitingThread;
boost::condition_variable cond;

void wait(boost::posix_time::time_duration dt){
    boost::mutex::scoped_lock lock(mutex);
    boost::system_time x = boost::posix_time::microsec_clock::local_time() + dt;
    bool timedOut = false;
    while((done == false) && (x > boost::posix_time::microsec_clock::local_time())) {
        timedOut = ! cond.timed_wait(lock,x);
    }
    if (timedOut){ std::cout << "timeout\n"; }
    else         { std::cout << "success\n"; }
}

void wait2(boost::posix_time::time_duration dt){
    boost::mutex::scoped_lock lock(mutex);
    bool timedOut = ! cond.timed_wait(lock,dt);
    if (timedOut){ std::cout << "timeout\n"; }
    else         { std::cout << "success\n"; }

}

void test(){
    //boost::thread waiter = boost::thread(wait,boost::posix_time::milliseconds(50));
    boost::thread waiter = boost::thread(wait2,boost::posix_time::milliseconds(50));
    boost::this_thread::sleep(boost::posix_time::milliseconds(2000));
}

但是,我不能100%确定虚假唤醒是否会使
timed_wait
返回
true
(如果是这种情况,我的
而(x>local_time())
将是多余的。

使用
boost::get_system_time()+dt
,这是基于UTC的,而不是
local_time()+dt
,它是时区调整的,因为
等待锁定(…)
使用
boost::get\u system\u time()
将当前时间与目标绝对时间进行比较

以下示例说明了该问题:

int main() {
    std::cout << "System time: " 
              << boost::get_system_time() << std::endl;
    std::cout << "Local time: " 
              << boost::posix_time::microsec_clock::local_time() << std::endl;
}
所以,基于绝对时间的
wait()
函数块仅在计算机时区偏移量指定的几个小时内有效,而不是永远有效

int main() {
    std::cout << "System time: " 
              << boost::get_system_time() << std::endl;
    std::cout << "Local time: " 
              << boost::posix_time::microsec_clock::local_time() << std::endl;
}
System time: 2017-Jun-07 08:47:58.836677
Local time: 2017-Jun-07 11:47:58.837003