将两个线程设置为相同的cpu亲和力pthread_getaffinity_np

时间:2018-08-15 08:46:15

标签: c++ linux multithreading affinity

    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时,它们会一直随机更改,这意味着代码失败。

2 个答案:

答案 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集。

相关问题