gpt4 book ai didi

c++ - 时钟()与getsystemtime()

转载 作者:行者123 更新时间:2023-11-27 22:29:35 26 4
gpt4 key购买 nike

我开发了一个用于多线程计算的类,一个线程只使用这个类的一个实例。我还想通过从另一个线程迭代此类的容器来测量计算的持续时间。该应用程序是win32。问题是我读过 QueryPerformanceCounter 在比较单个线程上的测量值时很有用。因为我不能使用它是我的问题,所以我想到了 clock() 或 GetSystemTime()。令人遗憾的是,这两种方法的“分辨率”均为毫秒(因为 CLOCKS_PER_SEC 在 win32 上为 1000)。我应该使用或概括哪种方法,对我来说有更好的选择吗?通常我必须在工作线程之外进行测量。这里有一些代码作为例子。

unsinged long GetCounter()
{
SYSTEMTIME ww;
GetSystemTime(&ww);
return ww.wMilliseconds + 1000 * ww.wSeconds;
// or
return clock();
}

class WorkClass
{
bool is_working;
unsigned long counter;
HANDLE threadHandle;
public:
DoWork()
{
threadHandle = GetCurrentThread();
is_working = true;
counter = GetCounter();
// Do some work
is_working = false;
}
};

void CheckDurations() // will work on another thread;
{
for(size_t i =0;i < vector_of_workClass.size(); ++i)
{
WorkClass & wc = vector_of_workClass[i];
if(wc.is_working)
{
unsigned long dur = GetCounter() - wc.counter;
ReportDuration(wc,dur);
if( dur > someLimitValue)
TerminateThread(wc.threadHandle);
}
}
}

最佳答案

QueryPerformanceCounter 适用于多线程应用程序。 可能 使用的处理器指令 (rdtsc) 在不同的处理器上调用时可能会提供无效结果。

我推荐阅读 "Game Timing and Multicore Processors" .

对于您的特定应用程序,您试图解决的问题似乎是在一些可能长时间运行的线程上使用超时。正确的解决方案是使用 WaitForMultipleObjects具有超时值的函数。如果时间到期,那么您可以终止任何仍在运行的线程 - 理想情况下通过设置每个线程检查的标志,但 TerminateThread 可能是合适的。

关于c++ - 时钟()与getsystemtime(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4508114/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com