是否有一个时间函数,其结果是保证每次更改被称为?

我试图这是GetTickCount64(),直到我试过这个:

#include <fstream> #include <windows.h> #include <iostream> void doSomething(); int main() { srand(GetTickCount64()); std::fstream file; file.open("test.dat", std::ios_base::out | std::ios_base::trunc); for (;;) file <<std::boolalpha<<(GetTickCount64()==GetTickCount64()) << std::endl; } 

和这个:

 #include <fstream> #include <windows.h> #include <iostream> void doSomething(); int main() { srand(GetTickCount64()); std::fstream file; file.open("test.dat", std::ios_base::out | std::ios_base::trunc); __int64 a, b; for (;;) { a = GetTickCount64(); doSomething(); b = GetTickCount64(); file <<std::boolalpha<<(a==b) << std::endl; } } void doSomething() { int T=(see below); for (int i = 0; i < (rand() % T); i++) __noop; } 

对于第一个变体,我每200.000真(806642迭代)收到1个假。

对于第二个变体,T = 5,每90000真(627018次迭代)收到1个假,T = 1000,每44444真(693361次迭代)收到1个假。

所以每次调用绝对不会给出不同的值。 我需要在一个共享内存区域创build一个时间戳,而且我试图猜测为什么程序不能正常工作,我有很多乐趣!

我可以使用什么function呢? 谢谢!

编辑澄清:我明白,计时器根本不能有一个无限的准确性,但我想知道是否存在一个计时器是足够的准确,比CPU更快(是的,这可能是一个荒谬的问题,但我只有一个模糊关于定时器如何工作的想法)。

顺便说一句,你是对的,我会用一些随机函数来产生一个唯一的数字,我会把时间存储在另一个地方。

既然你只关心单调递增的价值,而不关心一个人和另一个人之间有多大的差别,那么就好像InterlockedIncrement64对你有效。

从那里确保所有需要序列号的代码都可以访问相同的位置是一件简单的事情。 Windows有几个方法可以做到这一点,但是你并没有真正告诉我们你正在做什么/你如何使用它来给出有意义的建议,哪些最适合你的需求。

你可能想看看QueryPerformanceCounter:

http://msdn.microsoft.com/en-us/library/windows/desktop/dn553408%28v=vs.85%29.aspx

例如:

 LARGE_INTEGER li; QueryPerformanceCounter(&li); 

但是,它不是“保证每次调用都要改变”…

您可以使用__rdtsc()(MSVC)读取时间戳记计数器,

由于它是一个处理器注册表,它对自复位后的时钟周期数进行计数,所以两个近端调用返回相同的值是不可能的。

然而,这并不是在几秒钟内,而是在时钟周期中,所以将其转换为实时并不容易,特别是在时钟速度变化的情况下(现代处理器保证RDTSC频率更新不变,这可以通过CPUID进行检查)

另外,在早期的多核处理器上,这个值在内核之间没有同步(可以用CPUID进行检查)。 也在多处理器系统上。 所以跨多个线程的行为可能取决于硬件。

简短的答案是否定的,因为定时器从来没有一个无限的准确性。 即你将永远受限于底层定时器的准确性。

特别是GetTickCount ,解释你的观察的准确度有限 :

GetTickCount函数的分辨率受限于系统计时器的分辨率,通常在10毫秒到16毫秒的范围内。 GetTickCount函数的分辨率不受GetSystemTimeAdjustment函数调整的影响。

如果您的系统支持高分辨率定时器,Microsoft 建议使用性能计数器:

  • QueryPerformanceCounter的
  • QueryPerformanceFrequency的

在这个有用的教程中,Microsoft承认定时器的有限精度:

Windows已经并将继续投资提供可靠和高效的性能计数器。 如果需要时间戳记的分辨率为1微秒或更高,并且不需要将时间戳记同步到外部时间参考,请选择“QueryPerformanceCounter”或“KeQueryPerformanceCounter”。 当您需要分辨率为1微秒或更好的UTC同步时间戳时,请选择GetSystemTimePreciseAsFileTime或KeQuerySystemTimePrecise。

如果你只关心一个单调函数,你可以得到你自己的计数器(可能的不同输出的数量被用来计数的数据类型的范围所限制,例如这里是一个超长的数字)

例如:

 static unsigned long GetNext() { static unsigned long long counter; return counter++; } 

当然你对这个计数器的调用需要在多线程程序上同步,通常是一个InterlockedIncrement

假设Windows的CoCreateGuid呢? 我相信在其他平台上也有类似的方法。 更新:不知道…也许你正在寻找一个时间,而不是唯一。