【问题标题】:pthread on-wakeup executionpthread 唤醒时执行
【发布时间】:2012-11-19 15:35:45
【问题描述】:

如何让我的 pthread 每次被内核重新调度时执行一个函数?

我需要确定我的线程被安排在哪个物理 CPU/插槽(不是逻辑核心)上,并且不能一直这样做。

是否可以以某种方式挂钩唤醒例程,以便仅在线程实际被重新调度时才对 TLS 进行必要的更新?

至于我为什么需要这个:我的代码每线程每 70ns 执行 AMOs appx缓存失效。我打算专门为此分配内存,它只在运行相同 L3 缓存的线程之间共享。所以我需要确定我在哪个套接字上运行并寻址正确的内存块。我显然可以调用sched_getcpu 并将其与/proc/cpuinfo 中的物理CPU ID 进行比较,但这是一个相当大的开销。不过,我负担不起为每个线程分配线程专用内存,太贵了。

【问题讨论】:

  • 我不相信 pthreads 模型有这样的功能。而且,老实说,我认为如果您需要知道自己运行的 CPU 是什么,则存在更大的设计问题。
  • @twalberg 添加了解释。
  • 如果您不希望内核将您的线程移动到其他 cpu,请使用 sched_setaffinity(或 pthread_setaffinity)将其修复在某个 cpu 子集上。
  • 是的,我想到了。问题是我无法控制在我的 cpuset 上安排的其他内容。如果我能有效地识别我当前的 CPU,我宁愿不走那条路。也许cpuid 2xAPIC 字段可以用于那个......
  • getcpu() 系统调用是sched_getcpu() 的基础(您也可以直接调用它)被实现为 vsyscall,因此它可以非常快 - 它不必进入内核模式。读取/proc/cpuinfo 显然很慢,但您可以在启动时读取一次并将逻辑->物理转换缓存在一个小数组中。

标签: c linux pthreads scheduling


【解决方案1】:

根据我在 Linux Kernel Development, Third Edition 中读到的内容,内核没有为您提供所需的服务或接口。使用 pthread_setaffinity(如上面 @osgx 所建议的,或者,在最近的 linux 内核实现中,pthread_setaffinity_np)或缓存一个 TLS 密钥一开始的 cpu 套接字(正如上面 @caf 所建议的那样)可能是朝这个方向使用的最佳方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 2018-04-19
    • 2017-06-01
    • 2015-05-28
    • 2013-06-04
    • 2018-10-13
    • 2010-10-29
    相关资源
    最近更新 更多