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