【发布时间】:2017-11-20 12:55:13
【问题描述】:
我有一个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?
【问题讨论】:
-
您正试图减去两种不兼容的类型。您需要确保两者是同一类型。例如,通过将一个涉及的变量转换或转换为与另一个相同的类型(它不会自动发生)。
-
不管有没有
atomic,这都行不通
标签: multithreading c++11 chrono long-long