【问题标题】:In the c language in a multithreaded application how does clock() count time?在多线程应用程序的 c 语言中,clock() 如何计算时间?
【发布时间】:2019-02-09 12:20:34
【问题描述】:

我没有做过太多的 C 多线程开发,今天早些时候我对库函数 clock() 很好奇。

它在多线程应用程序中的表现如何(我假设使用 pthread)?它会计算自线程启动或原始程序启动以来的时钟滴答数?

让我们假设我正在运行一个普通的双核 CPU,就像一个老实的 core 2 duo 一样,两个线程都在运行,都试图使用 clock() 来计算时间。

  1. 都将获得自母应用程序启动以来的时钟滴答总数或
  2. 自他们自己的线程启动后开始计数或
  3. 第三个?

【问题讨论】:

  • #1。 clock() 基于进程的开始时间,因此任何进程线程都必须(应该)返回相同的值,假设是一个高质量的 C 库。

标签: c multithreading time


【解决方案1】:

在 Linux 和其他 POSIX 系统上,clock 计算所有线程消耗的总 CPU 滴答数。每个逻辑 CPU 核心都被计算在内,因此如果您有两个线程,每个线程都使用一个完整的核心,那么挂钟的每一秒将计为大约两秒的 CPU 时间。

在 Windows 上,clock 违反标准执行其他操作。

【讨论】:

    【解决方案2】:

    C 库函数clock() 应该返回自进程启动以来的时钟滴答数。

    实际上,内核可能(见注释)有一个“current_ticks_since_boot”变量并记住进程何时启动,并执行类似“current_ticks_since_boot - process->start_time”的操作。有多少线程正在运行(在多少 CPU 上),或者是否没有进程的线程正在运行(例如,所有线程都被阻塞等待某事)都没有区别。

    注意:现代内核通常使用“per CPU”变量来跟踪自启动以来的当前滴答声,并尝试使每个 CPU 的变量保持同步,并且可能(确实)使用内置于 CPU 中的计数器可以暴露给用户空间以避免内核 API 调用的成本。

    【讨论】:

      猜你喜欢
      • 2011-02-27
      • 2011-11-20
      • 1970-01-01
      • 2013-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多