将线程绑定到处理器

当我运行我的multithreading代码时,系统(linux)有时会将线程从一个处理器移到另一个处理器。 由于我拥有的处理器数量与我的处理器数量一样多,因此无法正确使用caching,导致跟踪活动混淆。

你知道如何将线程绑定到处理器,为什么系统会这样做?

Solutions Collecting From Web of "将线程绑定到处理器"

使用sched_setaffinity ( 这是Linux特有的 )。

为什么调度程序会在不同的处理器之间切换? 那么,想象你的线程最后在处理器1上运行,并且正在等待再次执行。 同时,处理器1上正在运行另一个线程,但处理器2是空闲的。 在这种情况下,调度程序将线程切换到处理器2是合理的。但是,复杂的调度程序将尽量避免在处理器之间“跳动”超过必要的线程。

你可以从bash中做到这一点。 有一个很好的taskset命令我知道这个问题(你也可以找到有关如何调度程序应该在那里运行的宝贵讨论)。 该命令采用进程的PID并将其绑定到特定的处理器。

 taskset -c 0 -p PID 

将进程与PID绑定到处理器(核心)号码0。

它与线程有什么关系? 为每个线程分配一个与pid相同权限的标识符,也称为“tid”。 你可以用gettid系统调用来获得它。 或者你可以看到它,例如,在top程序中按H键 (一些进程将拆分成许多看起来相同的条目,不同的pid —这些是线程)。