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