我需要std::chrono::high_resolution_clock::time_point
字段,我想从一个线程写入并从另一个线程读取。如果我声明它,我的代码编译没有任何错误。
但为了让我的字段在另一个线程中可见,我用std::atomic
像std::atomic<std::chrono::high_resolution_clock::time_point>
那样围绕它,现在我有以下编译错误:
/usr/include/c++/4.8/atomic:167:7: error: function ‘std::atomic<_Tp>::atomic() [with _Tp = std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long int, std::ratio<1l, 1000000000l> > >]’ defaulted on its first declaration with an exception-specification that differs from the implicit declaration ‘constexpr std::atomic<std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long int, std::ratio<1l, 1000000000l> > > >::atomic()’
atomic() noexcept = default;
我应该如何声明从一个线程写入的std::chrono::high_resolution_clock::time_point
字段并从另一个线程中读取(以确保“读取线程”看到最后一个值)?
答案 0 :(得分:11)
您的选择:
忘记将其设为原子并使用互斥锁序列化访问
选择一些整数时间单位(例如,自纪元以来的毫秒数)并在运行中转换为/从中进行转换,将积分值存储在您已经计算出的某种积分类型中具有足够的容量来覆盖日期范围你正在处理(也许是std::atomic_ullong
)
[完整性/不推荐]如果您的实施恰好将time_point
值保留在对象中,您可以接受 未定义的行为 并希望相同大小的整数类型可以存储time_point
,复制ala std::atomic_ullong x;
x.store(*reinterpret_cast<unsigned long long*>(&my_time_point));
/ *reinterpret_cast<unsigned long long*>(&my_time_point) = x.load();
答案 1 :(得分:9)
使用std::atomic<std::chrono::high_resolution_clock::duration>
并在存储时将其设置为time_point :: time_since_epoch();加载时,使用标准转换构造函数从原子的持续时间构造一个time_point。这是有必要的,但至少它是类型安全的,并且原子类型的大小或分辨率没有不确定性。