【发布时间】:2021-07-29 11:57:42
【问题描述】:
在使用 Vtune 分析程序时,我看到 libc 函数 sched_yield 被标记为重要热点。
现在我看到这个函数大致负责上下文切换;粗略地说是因为第一次遇到这个函数,所以我的理解是它运行在OS调度器内部,为改变活动线程提供支持。
将sched_yield 作为主要热点对我的程序意味着什么?这是否意味着我创建了比我应该创建的更多的线程并且操作系统正在尝试处理连续的上下文切换?
对于这种情况有什么补救措施?是否可以求助于更集中的线程池来避免过度生成线程?
接下来我应该分析什么?在这种情况下是否有“典型”的后续步骤? Vtune 已经建议对“线程”进行分析。
【问题讨论】:
-
sched_yield的行为很大程度上取决于操作系统。你运行的是什么操作系统? -
sched_yield 的预期行为是让其他东西运行。从分析器的角度来看,调用函数和从函数返回之间的时间将被计为在函数内部花费的时间。所以也许它应该看起来像一个热点?
-
经验法则:使用
sched_yield的代码通常是错误的、非常错误的或深奥的魔法™。拿一根很长的杆子,不要碰它。 -
@AndreySemashev Debian 9
-
是否有一个调用图可以表明 std::thread 背后的特性是什么? Libc 似乎只在线程死亡时调用 yield。
标签: c++ multithreading optimization intel-vtune