设置CPU亲和性
即,某个线程固定跑在某个CPU的(某个)核上
/**
* 设置当前线程cpu亲和性
* @param i cpu索引,如果为-1,那么取消cpu亲和性
* @return 是否成功,目前只支持linux---代码块来自ZLtookit
*/
bool setThreadAffinity(int i) { #if (defined(__linux) || defined(__linux__)) && !defined(ANDROID) cpu_set_t mask; CPU_ZERO(&mask); if (i >= 0) { CPU_SET(i, &mask); } else { for (auto j = 0u; j < thread::hardware_concurrency(); ++j) { CPU_SET(j, &mask); } } if (!pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask)) { return true; } WarnL << "pthread_setaffinity_np failed: " << get_uv_errmsg(); #endif return false; }
以下转载自(https://blog.csdn.net/m0_46376834/article/details/134834253)
cpu_set_t 类型是一个位图,每个位代表一个 CPU 核心。通过设置和操作这个位图,可以控制进程或线程的 CPU 亲和性,即将其绑定到特定的 CPU 核心上。
以下是一些常用的操作 cpu_set_t 的函数和宏:
CPU_ZERO(cpu_set_t* set):将 set 中的所有位清零,表示没有任何 CPU 核心被设置。
CPU_SET(int cpu, cpu_set_t* set):将 set 中的第 cpu 位设置为 1,表示将对应的 CPU 核心添加到集合中。
CPU_CLR(int cpu, cpu_set_t* set):将 set 中的第 cpu 位清零,表示将对应的 CPU 核心从集合中移除。
CPU_ISSET(int cpu, cpu_set_t* set):检查 set 中的第 cpu 位是否被设置为 1,返回一个非零值表示已设置,否则返回 0。
使用 cpu_set_t 可以实现将进程或线程绑定到特定的 CPU 核心上,以提高程序的性能和可预测性。例如,在多核系统中,可以将不同的任务分配给不同的 CPU 核心来并行执行,以充分利用系统资源。