VS11稳定锁定,稳定
VS11 is steady_clock, steady?
我刚刚注意到<chrono.h>
中的以下代码,这对我来说没有意义。
struct system_clock
{
static const bool is_monotonic = false; // retained
static const bool is_steady = false;
};
class steady_clock
: public system_clock
{ // wraps monotonic clock
public:
static const bool is_monotonic = true; // retained
static const bool is_steady = true;
};
typedef steady_clock monotonic_clock; // retained
typedef system_clock high_resolution_clock;
当steady_clock
简单地从不稳定的system_clock
导出时,它如何稳定?
忽略您显示的代码(Jerry的回答已经比我更好地解决了这一问题),可能VC++2012的std::steady_clock
是不稳定的,MS Connect上当前打开的关于这个问题的多个错误报告证明了这一点:
- steady_clock类和clock()函数不符合C++11和C11标准
- [C++]std::chrono::steady_clock不稳定
- (可能相关)C++标头的high_resolution_clock没有高分辨率
暂时忽略微软实现中的错误,让一个稳定的时钟从一个不稳定的时钟中派生出来(或者让一个单调的时钟从非单调的时钟派生出来)通常是非常有意义的。
这是典型的"is-a"术语所阻碍的地方之一,你需要真正从替代的角度来思考。特别是,这种情况不是"稳定的时钟不是非稳定的时钟,所以推导是错误的"。相反,这种情况是"在任何情况下,稳定的时钟都可以代替非稳定的钟,所以推导很好"(is_monotonic
也是如此)。
让我们考虑一个极端的例子——将原子钟直接连接到您的计算机。它是单调的,并且尽可能稳定。假设它的输出足够高的频率(/分辨率),您可以使用它来代替系统可能有的任何/每一个其他时钟。
我实际上不同意"接受的答案"。这完全是微软方面的错误,可能会引起不切实际的期望。C++11标准要求system_clock
实现to_time_t
和from_time_t
,但对steady_clock
和high_resolution_clock
没有这样的要求。它不是"is-a"关系,因为steady_clock
并没有实现system_clock
所需的所有接口;微软的行动对我来说毫无意义:你怎么能指望steady_clock
有to_time_t
,同时避免时间偏移的问题?
所以,简单地说,微软犯了一个错误,他们修复它的速度很慢。根据Stephan T.Lavavej的说法,他"在2013 RTM中没有时间修复这个问题","所有的时钟都需要重新实现,因为有几个活跃的bug在跟踪"。看见https://connect.microsoft.com/VisualStudio/feedback/details/719443/.
我想一开始并不是他写的垃圾假实现。
编辑:我有点惊讶,我被否决了,甚至有点沮丧。我的悲观选民和反对者,你意识到你在为一个可能很快就会改变和修复的支离破碎的实施合理化吗?给我举一个真正的实现,它的steady_clock
继承自system_clock
,并且没有中断。。。。
2014年7月的事实更新:自Visual Studio 2014 CTP2起,steady_clock
不再继承自system_clock
。。。。
- 将字符串存储在c++中的稳定内存中
- 如何找到锁定Linux futex的C++行
- G锁定铸造到基础上会释放模拟行为
- 如何检查线程是否锁定
- 如何在C++中找到active directory中禁用和锁定的窗口帐户
- 我应该在锁定TBitmap画布后解锁它吗
- C++ 11 中的锁定是否保证访问数据的新鲜度?
- 在两个线程上读/写 64 位,无互斥/锁定/原子
- 使用 std::sort 对向量进行稳定排序
- 如何在实时应用程序中锁定线程
- 在 lambda 中锁定 std::shared_ptr 的复制操作
- Arduino Nano:A4988 使用串行输入时通过定时器进行步进控制不稳定
- 使用简单两相锁定的并发程序
- 锁定来自其他线程的类成员
- 他们如何将红外锁定像素转换为镜头前方 1m 的正常平面上的位置
- 同一互斥锁顺序上的锁定和解锁是否一致?
- 共享内存的升压容器是否实现锁定?
- 当只有一个线程主要使用该对象而其他线程很少使用它时,如何最小化该对象的互斥锁锁定?
- 如何在 x86 处理器上实现"锁定添加"
- VS11稳定锁定,稳定