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