等待 pthread_cond_wait 的线程在收到信号后唤醒需要多长时间?我怎么估计这个时间?

use*_*369 3 c++ performance multithreading pthreads condition-variable

我正在编写 C++ ThreadPool 植入并在我的工作人员的主函数中使用 pthread_cond_wait。我想知道从发出条件变量信号到等待它的线程/线程唤醒需要多长时间。你知道我如何估计/计算这个时间吗?

非常感谢。

Sur*_*urt 6

这取决于上下文切换的成本

  1. 在操作系统上,
  2. 中央处理器
  3. 是线程还是不同的进程
  4. 机器的负载
  5. 是否切换到与上次运行相同的核心
  6. 什么是工作集大小
  7. 自上次运行以来的时间

Linux 最佳情况,i7,1100ns,线程在同一进程中,与上次运行的内核相同,作为最后一个线程运行,无负载,工作集 1 字节。

糟糕的情况,从缓存中刷新,不同的内核,不同的进程,只需要 30 微秒的 CPU 开销。

成本去哪儿了:

  1. 保存最后一个过程上下文 70-400 个周期,
  2. 加载新上下文 100-400 个周期
  3. 如果不同的进程,刷新 TLB,重新加载 3 到 5 个页面遍历,这可能来自内存,每个循环需要大约 300 个周期。如果触摸超过一页,包括说明和数据,再加上几页游走。
  4. 操作系统开销,我们都喜欢漂亮的统计数据,例如将上下文切换计数器加 1。
  5. 调度开销,接下来运行哪个任务
  6. 新内核上的潜在缓存未命中~自己的 L2 缓存上的每个缓存行约 12 个周期,从那里开始下坡,数据离得越远,数据越多。