这个条件变量实现有什么问题?

时间:2015-12-21 23:24:38

标签: c++

我已经实现了使用c ++客户端每10秒调用一次服务API的代码。大多数时候我都注意到它大概是10秒钟,但偶尔我会看到下面的问题看起来更长。我在wait_until上使用条件变量。我的实施有什么问题?有任何想法吗? 这是时序输出:

currentDateTime()=2015-12-21.15:13:21
currentDateTime()=2015-12-21.15:13:57

代码:

void client::runHeartbeat() {
    std::unique_lock<std::mutex> locker(lock);
    for (;;) {
        // check the current time
        auto now = std::chrono::system_clock::now();
        /* Set a condition on the conditional variable to wake up the this thread.
           This thread is woken up on 2 conditions:
           1. After a timeout of now + interval when we want to send the next heartbeat
           2. When the client is destroyed. 
           */
        shutdownHeartbeat.wait_until(locker, now + std::chrono::milliseconds(sleepMillis));
        // After waking up we want to check if a sign-out has occurred.
        if (m_heartbeatRunning) {

            std::cout << "currentDateTime()=" << currentDateTime() <<   std::endl;
            SendHeartbeat();
        }
        else {
            break;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您可能需要考虑使用high_resolution_clock来满足您的需求。 system_clock不能保证高分辨率,因此这可能是问题的一部分。

请注意,它的定义是依赖于实现的,因此您可能只是在某些编译器上将typedef返回到system_clock。