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

标签 c++ multithreading time clock measurement

我开发了一个用于多线程计算的类,一个线程只使用这个类的一个实例。我还想通过从另一个线程迭代此类的容器来测量计算的持续时间。该应用程序是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/

相关文章:

安卓 : background thread

安卓 : Time milliseconds to X day - X hours - x Minute - X seconds left

c++ - 如何使用附加模板参数编写 not "in situ"方法

c++ - 如何在不创建新行的情况下使用 cin 输入变量?

java - Java 中的条件如何知道要触发哪个线程?

在 C 中聊天服务器客户端。使用线程还是进程?

c# - TIME(2) 列的值显示为带有额外的精度零,而查询仅返回 2

ruby-on-rails - 在 Rails 模型中使用持续时间字段

C++,链接顺序是否标准化?

c++ - 大小基于用户输入的井字棋盘