Multithreading C++;Chrono-如何使用std::atomic<;上的持续时间;long>;?

Multithreading C++;Chrono-如何使用std::atomic<;上的持续时间;long>;?,multithreading,c++11,chrono,long-long,Multithreading,C++11,Chrono,Long Long,我有一个类栏,带有: class Bar { public: //... private: std::atomic<long long> m_keepAlive; } 正在从另一个线程调用此方法,并更新我的m_keepAlive void Bar::keepAlive() //This method is being called from other thread { m_keepAlive= getTimeSinceEpoch(); }

我有一个
类栏
,带有:

class Bar
{
public:
    //...
private:
    std::atomic<long long>          m_keepAlive;
}
正在从另一个
线程调用此
方法
,并更新我的
m_keepAlive

void Bar::keepAlive() //This method is being called from other thread
{
    m_keepAlive= getTimeSinceEpoch();
}
在我的
Bar类
中,我有一个方法,它不断调用这个
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
    }
}
void Bar::checkKeepAlive()
{
自动现在=标准::时钟::系统时钟::现在();
//这里有编译错误
自动差异=std::chrono::duration\u cast(现在-m\u keepAlive);
auto timeMsSinceNoReply=差异。计数();
如果(timemssincereply>=2000)
{
//超时
}
}
为了实现这一点,我在类上创建了线程安全的
std::atomic

但是,我得到了以下编译错误:

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::chrono::time\u point”和“long-long-int”)

如何在
std::atomic
上使用
duration\u cast

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

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

  • 现在
    的类型为
    std::chrono::system\u clock::time\u point
  • m_keepAlive
    属于
    std::atomic
    类型
即使将
m_keepAlive
更改为
long
,它仍然无法工作

您需要将
m_keepAlive
转换为持续时间,然后再尝试从
now
中减去它

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

充分表达应该是:
const auto difference=now-std::chrono::system_clock::time_point(std::chrono::毫秒(m_keepAlive.load());

然后按如下方式使用:
if(difference>=std::chrono::seconds(2)){…}

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

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

  • 现在
    的类型为
    std::chrono::system\u clock::time\u point
  • m_keepAlive
    属于
    std::atomic
    类型
即使将
m_keepAlive
更改为
long
,它仍然无法工作

您需要将
m_keepAlive
转换为持续时间,然后再尝试从
now
中减去它

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

充分表达应该是:
const auto difference=now-std::chrono::system_clock::time_point(std::chrono::毫秒(m_keepAlive.load());

然后按如下方式使用:
if(difference>=std::chrono::seconds(2)){…}

您正在尝试减去两个不兼容的类型。您需要确保两者都是相同的类型。例如,通过强制转换或将其中一个涉及的变量转换为与另一个相同的类型(不会自动发生)。无论是否使用
原子
都不起作用。您试图减去两个不兼容的类型。您需要确保两者都是相同的类型。例如,通过强制转换或将其中一个涉及的变量转换为与另一个相同的类型(不会自动发生)。这在使用或不使用
原子时都不起作用
谢谢@dalle差异是正确的,但是
如果(差异>=std::chrono::seconds(2))
没有编译,因为
与“operator>=”不匹配(操作数类型是“const std::chrono::time_point”和“std::chrono::seconds{aka std::chrono::duration}”)
如何将此持续时间与时间点进行比较?@waas1919我忘记了在差异表达式中初始化时间点。这正是我需要的。谢谢!谢谢@dalle差异是正确的,但是
如果(差异>=std::chrono::seconds(2))
未编译,因为
与“operator>=”不匹配(操作数类型为“const std::chrono::time_point”和“std::chrono::seconds{aka std::chrono::duration}”)
如何将此持续时间与时间点进行比较?@waas1919我忘记在差异表达式中初始化时间点。这正是我需要的。谢谢!
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’)