【问题标题】:How to find total time used by the thread in C/C++?如何在 C/C++ 中查找线程使用的总时间?
【发布时间】:2017-03-06 11:36:17
【问题描述】:

我正在尝试以编程方式获取特定线程到目前为止所花费的总时间。

getrusage 返回线程的 CPU 时间,但我想要 total 时间,即包括线程因任何原因被阻塞所花费的时间。

请注意,我将通过使用我编写的分析器检测给定程序来利用此功能。

一个程序可能有很多线程(我专注于分析服务器,所以可以有很多)。在任何给定时间,我都想知道特定线程花费了多少时间(到目前为止)。因此,在每个线程产生时为每个线程启动一个计时器并不方便。所以我想要一些类似于getrusage 的用法,例如它返回当前线程的总时间,或者我可以将线程 ID 传递给它。因此,手动机制(例如在生成线程时获取时间戳,然后再获取它们的差异)对我来说不是很有帮助。

谁能建议如何做到这一点?

谢谢!

【问题讨论】:

  • 您可以使用chrono::steady_clock 来衡量自您的话题开始以来经过的总时间。
  • 或许可以试试clock_gettime(CLOCK_THREAD_CPUTIME_ID, ...);
  • Boost 是 c++ 的 jquery。标准库应该足以应付一切,但每个人都喜欢黑魔法。
  • 听起来你想知道线程在上下文中花费了多长时间,无论是否被阻塞。也许你想看看 strace 的源代码,看看它是怎么知道的。
  • @paddy 终于有人抓到我了哈哈。是的,这就是我想要的。你能详细说明一下 strace 吗?

标签: c++ c multithreading time getrusage


【解决方案1】:

在线程启动时保存当前时间。线程花费的总时间,包括运行时间和阻塞时间,就是:

current_time - start_time

当然,这几乎总是没用/毫无意义,这就是为什么没有专门的 API 的原因。

【讨论】:

  • 这不是我想要的。
  • @DanishAlsayed 从你写的来看,这正是你想要的,所以你需要用不同的方式描述你想要的。
  • 不,我们想了解您的问题,在目前的状态下,这是相当困难的。 “总时间,即包括因任何原因被阻塞的线程所花费的时间”的唯一合理解释是“挂钟时间”,但您明确拒绝挂钟时间并且不提供任何替代解释。
  • 换个说法吧;我拒绝了获取 2 个时间戳然后计算它们的差异的想法。我要求一个 API/现有库可以返回这个时间值,或者一个可以返回我创建线程的时间的库,然后我可以从当前时间戳中减去它。
【解决方案2】:

根据您要使用它的目的,可以考虑的一种可能性是将阻塞期间消耗的时钟滴答数相加,这通常足够慢,从而隐藏了一些这样的开销。因此,根据该总和以及您还测量的周围线程间隔,您可以计算该间隔内线程上的实时负载。当然,与其他进程进行时间切片会在一定程度上消除这种情况,捕获所有阻塞可能非常容易或非常困难,具体取决于您的情况。

【讨论】:

    猜你喜欢
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多