在多线程应用程序中的 c 语言中,clock() 如何计算时间



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

它在多线程应用程序中的行为如何(我假设使用 pthread(?它会计算自线程启动以来或自原始程序启动以来的时钟周期数吗?

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

  1. 将获得自母应用程序启动以来的时钟周期总数,或者
  2. 自他们自己的线程启动以来开始计数或
  3. 第三种?

在 Linux 和其他类似 POSIX 的系统上,clock 计算所有线程消耗的总 CPU 时钟周期。每个逻辑 CPU 内核都会被计算在内,因此,如果有两个线程,每个线程使用整个内核,则挂钟的每一秒将计为大约两秒的 CPU 时间。

在Windows上,clock ,违反标准,做其他事情。

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

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

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

最新更新