c++ - 是否有时间函数保证每次调用时其结果都会改变?

标签 c++ windows synchronization

我一直以为是 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/

相关文章:

windows - 在 server core 2019ltsc 容器镜像中添加字体

java - JNI->MonitorEnter 的替代方案

svn - 将 SourceSafe 与 SVN 同步

c++ - 将数组传递给类函数 C++

windows - 在 Azure AKS 节点上运行 PowerShell 脚本,

python - 如何以编程方式将两个 aac 文件合并为一个文件?

android - 我的 android app 同步 chrome pc 书签有 Api 吗?

C++:QGridLayout - 小部件之间的空白

c++ - 二叉树中的递归搜索

c# - 包装 OpenCv C++ 代码以在 C# 中使用