我没有用 C 语言做过太多的多线程开发,今天早些时候我对库函数 clock(( 感到好奇。
它在多线程应用程序中的行为如何(我假设使用 pthread(?它会计算自线程启动以来或自原始程序启动以来的时钟周期数吗?
让我们假设我正在运行一个普通的双核 CPU,就像一个旧的诚实核心 2 duo 一样,并且运行两个线程都试图使用 clock(( 计算时间。
- 将获得自母应用程序启动以来的时钟周期总数,或者
- 自他们自己的线程启动以来开始计数或
- 第三种?
在 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 调用的成本。