【发布时间】:2016-10-14 03:27:56
【问题描述】:
在 Linux/GNU/C 环境中,是否可以看到正在运行的线程是否已进入睡眠状态。例如说你有一个类似的功能
void foo() {
startClock();
bar();
endClock();
}
但您只关心代码本身的运行时间。 IE。您不关心与运行期间被挂起的线程相关的任何时间。理想情况下,您可以利用一些系统调用或库,例如 countThreadSwitches(),这样:
void foo() {
int lastCount = countThreadSwitches();
startClock();
bar();
endClock();
if (countThreadSwitches() != lastCount)
discardClock();
}
能够判断线程是否已在两个语句之间切换,将允许我们仅测量不受上下文切换影响的运行。
那么,有没有类似假设的 countThreadSwitches() 调用?或者这些信息对线程本身是不透明的?
【问题讨论】:
-
可以通过运行
foo10000 次来推断信息,并保留所用时间的直方图。假设foo相当短(小于 10 毫秒),大部分时间将分组在时间尺度的低端,即实际运行时间。 -
如果您正在调用clock() 系统函数,那么您已经获得了只考虑线程实际运行时间的时钟值。 (即时钟()返回的值仅在您的线程实际运行时增加)
-
@JeremyFriesner
clock不返回处理时间。在一个进程中有多个线程,我不认为clock会给你线程时间。 -
@Jeremy 使用 CLOCK_THREAD_CPUTIME_ID 不是一个坏建议。不幸的是,开销比 CLOCK_REALTIME 差了大约 6 倍。
-
@user3386109 这是个好主意。不幸的是,假设有问题的代码有一个很长的右尾,这是特别有趣的。可以可靠地确定中位数,但如果我们想要可靠地估计第 99.9 个百分位数。
标签: c linux multithreading pthreads