voidworker(int cpu_id, constchar* name){ // 绑定 if (!bind_current_thread_to_cpu(cpu_id)) { std::cerr << name << " failed to bind to CPU" << cpu_id << "\n"; return; }
// 打印一次绑定信息,并持续打印当前所在 CPU 验证效果 pid_t tid = (pid_t)syscall(SYS_gettid); std::cout << name << " (TID=" << tid << ") bound to CPU" << cpu_id << "\n";
for (int i = 0; i < 10; ++i) { // sched_getcpu() 返回当前线程正在运行的逻辑 CPU 编号 int cur = sched_getcpu(); std::cout << name << " (TID=" << tid << ") running on CPU " << cur << "\n"; std::this_thread::sleep_for(std::chrono::milliseconds(300)); } }
// 主线程不绑定,打印它当前所在 CPU(可能变化) for (int i = 0; i < 5; ++i) { int cur = sched_getcpu(); std::cout << "main thread running on CPU " << cur << "\n"; std::this_thread::sleep_for(std::chrono::milliseconds(500)); }
~ » ./pin main thread running on CPU 1 worker-1 (TID=896669) bound to CPU1 worker-1 (TID=896669) running on CPU 1 worker-0 (TID=896668) bound to CPU0 worker-0 (TID=896668) running on CPU 0 worker-1 (TID=896669) running on CPU 1 worker-0 (TID=896668) running on CPU 0 main thread running on CPU 1 worker-1 (TID=896669) running on CPU 1 worker-0 (TID=896668) running on CPU 0 worker-1 (TID=896669) running on CPU 1 worker-0 (TID=896668) running on CPU 0 main thread running on CPU 1 worker-1 (TID=896669) running on CPU 1 worker-0 (TID=896668) running on CPU 0 main thread running on CPU 1 worker-1 (TID=896669) running on CPU 1 worker-0 (TID=896668) running on CPU 0 worker-0 (TID=896668) running on CPU 0 worker-1 (TID=896669) running on CPU 1 main thread running on CPU 1 worker-0 (TID=896668) running on CPU 0 worker-1 (TID=896669) running on CPU 1 worker-0 (TID=896668) running on CPU 0 worker-1 (TID=896669) running on CPU 1 worker-0 (TID=896668) running on CPU 0 worker-1 (TID=896669) running on CPU 1
worker-0 永远在 CPU0,worker-1 永远在 CPU1,主线程可能在不同 CPU 间调度。
[1] 896965 pid=896965 main thread running on CPU worker-0 (TID=3896971 ) bound to CPU0 worker-0 (TID=896971) running on CPU 0 worker-1 (TID=896972) bound to CPU1 worker-1 (TID=896972) running on CPU 1 --------------------------------------------------------------------------------------------------- ~ » worker-0 (TID=worker-1896971) running on CPU 0 (TID=896972) running on CPU 1 main thread running on CPU 3 worker-0 (TID=896971) running on CPU 0 worker-1 (TID=896972) running on CPU 1 worker-0 (TID=896971) running on CPU 0 worker-1 (TID=896972) running on CPU 1 main thread running on CPU 5 worker-0 (TID=896971) running on CPU 0 worker-1 (TID=896972) running on CPU 1 main thread running on CPU 5 worker-0 (TID=896971) running on CPU 0 worker-1 (TID=896972) running on CPU 1 worker-0 (TID=896971) running on CPU 0 worker-1 (TID=896972) running on CPU 1 main thread running on CPU 5 worker-0 (TID=896971) running on CPU 0 worker-1 (TID=896972) running on CPU 1 worker-0 (TID=896971) running on CPU 0 worker-1 (TID=896972) running on CPU 1 worker-0 (TID=896971) running on CPU 0 worker-1 (TID=896972) running on CPU 1