cpu_set_t cpuset;
CPU_ZERO(&cpuset);
std::cout << "current cpu: " << sched_getcpu() << std::endl;
CPU_SET(sched_getcpu(), &cpuset);
if (pthread_setaffinity_np(std_thread.getNativeHandle(), sizeof(cpu_set_t), &cpuset) == 0) {
std::cout << "Afinity ok!!!" << std::endl;
} else {
std::cout << "second thread set affinity failed." << std::endl;
}
基本上,我正在尝试使主线程(main())和新创建的线程(std_thread)在同一CPU中运行。该代码打印出“ Afinity ok !!!”但是当我检查两个线程在htop工具中使用的是哪个CPU时,它们会一直随机更改,这意味着代码失败。
答案 0 :(得分:3)
如果在代码内没有这样做的硬理由,则可以使用taskset
命令,并且可以在创建过程以及运行时进行
如果要在特定的CPU中启动该进程,请输入数字
taskset -c <CPUNumber> ProgramName
或者动态地可以使用PID进行更改
taskset -cp <CPUNumber> PID
答案 1 :(得分:2)
通过pthread_getaffinity_np()
,您将在cpuset
中获得线程的亲和力。如果检查此cpu集的值,则应注意,它覆盖了计算机的所有CPU。实际上,默认情况下,线程可以使用计算机的任何CPU。您的代码所做的只是设置其他线程与整个计算机的亲和力(换句话说,什么也没有)。
您应该做的实际上是在cpuset
中设置一个CPU,然后设置两个线程的相似性。您还可以使用sched_getcpu()
获取正在其中运行一个线程的cpu,在cpuset
中设置此cpu,然后将两个线程的亲和性都设置为此cpu集。