C++ Chrono - 如何在 std::atomic<long long> 上使用 duration_cast?

C++ Chrono - How to use the duration_cast on std::atomic<long long>?

我有一个 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
    }
}

为了实现这一点,我在 class.

上创建了 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’)

如何在 std::atomic<long long> 上使用 duration_cast

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

now - m_keepAlive 在您的示例中是非法的。你的编译器告诉你这个。

  • now 属于 std::chrono::system_clock::time_point.
  • 类型
  • m_keepAlive 属于 std::atomic<long long>.
  • 类型

即使你把m_keepAlive改成long 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)) { ... }