0

我有一个class Bar

class Bar
{
public:
    //...
private:
    std::atomic<long long>          m_keepAlive;
}

class有一些方法如下所述。

method得到了时代ms

long long Bar::getTimeSinceEpoch()
{
    std::chrono::time_point<std::chrono::system_clock> p = std::chrono::system_clock::now();
    const long long epoch = std::chrono::duration_cast<std::chrono::milliseconds>(p.time_since_epoch()).count();
    return epoch;
}

method是从另一个调用thread并更新我的m_keepAlive.

void Bar::keepAlive() //This method is being called from other thread
{
    m_keepAlive= getTimeSinceEpoch();
}

在我的 上Bar class,我有一个方法不断调用此checkKeepAlive()方法并检查自上次执行以来是否经过了2 秒Bar::keepAlive()

void Bar::checkKeepAlive()
{
    auto now = std::chrono::system_clock::now();

   //COMPILATION ERROR here
    auto difference = std::chrono::duration_cast<std::chrono::milliseconds>(now - m_keepAlive); 

    auto timeMsSinceNoReply = difference.count();

    if(timeMsSinceNoReply >= 2000)
    {
        //timeout
    }
}

为了实现这一点,我在 课堂上创建std::atomic<long long>线程安全的。

但是,我收到此编译错误:

no match for ‘operator-’ (operand types are ‘std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long int, std::ratio<1l, 1000000000l> > >’ and ‘long long int’)

如何使用duration_caston std::atomic<long long>

4

1 回答 1

3

chrono 库的构建是为了让您保持显式和类型安全,通过使用对std::chrono::duration::count您正在滥用库的所有调用。

now - m_keepAlive在您的示例中是非法的。您的编译器会告诉您这一点。

  • now是类型std::chrono::system_clock::time_point
  • m_keepAlive是类型std::atomic<long long>

即使您更改m_keepAlivelong long,它仍然无法正常工作。

m_keepAlive在尝试从 中减去它之前,您需要转换为持续时间now

例如:std::chrono::milliseconds(m_keepAlive.load())将保存的值解释m_keepAlive为毫秒数。

完整的表达应该是: const auto difference = now - std::chrono::system_clock::time_point(std::chrono::milliseconds(m_keepAlive.load());

然后使用如下: if(difference >= std::chrono::seconds(2)) { ... }

于 2017-11-20T13:15:29.340 回答