当一个线程被绑定到特定的 CPU 核心后,该核心上的执行资源就专门用于执行该线程,不会被调度器切换去执行其他线程。这样可以避免与其他线程的竞争,减少上下文切换的开销,提高执行效率。
c++中如何将线程绑定cpu
相关函数在头文件 <sched.h>中,该头文件主要和进程/线程的调度有关
- 首先是声明一个cpu_set_t
cpu_set_t是一个数据结构,主要用于表示一组CPU,其中每个bit代表线程/进程可以使用的CPU。它是被实现为位掩码的结构,通常用于将进程或线程绑定到特定的CPU核心上。 - 然后使用 CPU_ZERO() 函数来初始化它,即清除所有位,使其不包含任何CPU。
- 接着可以用 CPU_SET() 函数来设置 cpu_set_t 中的特定位,用以标记进程或线程可以被调度到的CPU。
- 设置线程亲和性,pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) 便完成了绑定
#include <iostream>
#include <thread>
#include <pthread.h>
void threadFunction(int coreId) {
// 设置线程亲和性
cpu_set_t mask;
CPU_ZERO(&mask);
CPU_SET(coreId, &mask);
if (pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) < 0) {
std::cerr << "Failed to set thread affinity." << std::endl;
}
// 线程的实际工作
// ...
std::cout << "Thread finished." << std::endl;
}
int main() {
// 创建线程并绑定到CPU核心 0
std::thread t1(threadFunction, 0);
// 创建线程并绑定到CPU核心 1
std::thread t2(threadFunction, 1);
// 等待线程结束
t1.join();
t2.join();
return 0;
}