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



我有一个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()方法并检查自上次执行Bar::keepAlive()以来是否已经过去了 2 秒

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’)

如何在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)) { ... }

相关内容

  • 没有找到相关文章

最新更新