我一直以为是 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,我每 4444 次正确(693361 次迭代)收到 1 个错误。
所以绝对不是每次调用都给不同的值。我需要在共享内存区域中创建一个时间戳,并且我在尝试猜测程序无法运行的原因时玩得很开心!
我可以改用什么功能? 谢谢!
编辑 以澄清:我明白计时器不可能具有无限的准确性,但我想知道是否存在一个计时器,其准确性足以比 cpu 更快(是的,可能是这是一个荒谬的问题,但我对计时器的工作原理只有一个模糊的概念。
顺便说一句,你是对的,我将使用一些随机函数来生成一个唯一的数字,并将时间存储在另一个地方。
最佳答案
因为你只关心单调递增的值,而不(显然)关心一个和下一个之间有多少差异,看起来像InterlockedIncrement64会为你工作。
从那里开始,确保所有需要序列号的代码都可以访问同一位置是一件简单的事情。 Windows 有几种方法可以做到这一点,但您还没有真正告诉我们您在做什么/您如何使用它来提供有意义的建议,说明哪种方法最适合您的需求。
关于c++ - 是否有时间函数保证每次调用时其结果都会改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24099999/