【Linux下进程的CPU配置和线程绑定】( 三 )


一个线程的CPU亲合力掩码用一个结构体来表示一个CPU集合,下面的几个宏分别对这个掩码集进行操作:
CPU_ZERO() 清空一个集合CPU_SET()与CPU_CLR()分别对将一个给定的CPU号加到一个集合或者从一个集合中去掉CPU_ISSET()检查一个CPU号是否在这个集合中
设置获取线程CPU亲和力状态:
sched_setaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask)
该函数设置线程为pid的这个线程,让它运行在mask所设定的CPU上 。如果pid的值为0,则表示指定的是当前线程,使当前线程运行在mask所设定的那些CPU上 。第二个参数是mask所指定的数的长度 。通常设定为() 。如果当前pid所指定的线程此时没有运行在mask所指定的任意一个CPU上,则该指定的线程会从其它CPU上迁移到mask的指定的一个CPU上运行 。
sched_getaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask)
该函数获得pid所指示的线程的CPU位掩码,并将该掩码返回到mask所指向的结构中 。即获得指定pid当前可以运行在哪些CPU上 。同样,如果pid的值为0 。也表示的是当前进程 。
简单的实例:
// 此代码不完整,只是帮助理解绑定过程// 在创建线程时添加以下代码,可以将该线程绑定到1核cpu_set_t mask;// 将掩码清零CPU_ZERO(&mask);// 将1添加到掩码中CPU_SET(1, &mask);// #将本线程绑定到1核sched_setaffinity(0, sizeof(cpu_set_t), &mask);
查看线程是否运行在指定的核上:
【【Linux下进程的CPU配置和线程绑定】】实际工作中,为了方便查看线程的情况,会在创建线程时将相关信息保存到一个文件中,需要时用cat命令查看,内容包括创建了哪些线程、线程名称、线程id和pid、绑定的CPU核、优先级、调度方式等 。