【问题标题】:set two threads to the same cpu affinity pthread_getaffinity_np将两个线程设置为相同的 cpu 亲和性 pthread_getaffinity_np
【发布时间】:2018-08-15 08:46:15
【问题描述】:
    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 时,它们一直随机变化,这意味着代码失败。

【问题讨论】:

  • 您确定您的第一个线程在其关联掩码中只设置了一个 CPU?
  • 感谢您的评论。检查下面的答案,我已修复,但结果仍然相同。 @肖恩

标签: c++ linux multithreading affinity


【解决方案1】:

如果在代码中没有硬性理由这样做,那么您可以使用taskset 命令,并且可以在创建进程时以及运行时完成

如果你想在特定的 CPU 中启动进程,请将编号指定为

taskset -c <CPUNumber> ProgramName

或者您可以使用 PID 动态更改

taskset -cp <CPUNumber> PID

【讨论】:

  • 我需要两个线程在同一个内核上运行,其余的可以由操作系统分配。或者将来我可能希望将每个线程设置为自己的核心。
  • 您可以通过分配与taskset相同的线程ID核心数来做同样的事情 -cp ThreadID
【解决方案2】:

使用pthread_getaffinity_np(),您将获得cpuset 中线程的亲和性。如果你检查这个 cpu 集的值,你应该注意到它跨越了你机器的所有 cpu。事实上,默认情况下,线程可以使用机器的任何 CPU。您的代码所做的只是将您的其他线程与整台机器的关联性设置为(换句话说,什么都没有)。

你应该做的实际上是在cpuset中设置一个cpu,然后设置两个线程的affinity。您还可以使用sched_getcpu() 获取您的一个线程正在运行的cpu,将此cpu 设置为cpuset,然后将您的两个线程的affinity 设置为此cpu 集。

【讨论】:

  • cpu_set_t cpuset; CPU_ZERO(&amp;cpuset); CPU_SET(sched_getcpu(), &amp;cpuset); if (pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &amp;cpuset) == 0) { if (pthread_setaffinity_np(std_thread.getNativeHandle(), sizeof(cpu_set_t), &amp;cpuset) == 0) { std::cout &lt;&lt; "Afinity ok!!!" &lt;&lt; std::endl; } else { std::cout &lt;&lt; "second thread set affinity failed." &lt;&lt; std::endl; } } else { std::cout &lt;&lt; "main thread set affinity failed." &lt;&lt; std::endl; } 不起作用(“Afinity ok!!!”在控制台中打印,但在 htop 中 cpus 仍然是随机的),感谢您的评论。
  • 你确定这不是因为另一个进程在另一个 cpu 上运行吗?在您的程序运行时,尝试使用 taskset -a -p &lt;pid&gt; 从另一个终端获取线程的亲和性,以查看亲和性是否真的发生了变化。
  • 我已经发出了你给我的任务集命令,所有线程的结果都是:“当前亲和掩码:f”。我在代码运行前后都发出了命令,结果没有变化。
  • 我还添加了一个std::cout &lt;&lt; "current cpu: " &lt;&lt; sched_getcpu() &lt;&lt; std::endl;,结果很奇怪,我有4个核心但有时打印结果是“12”。
  • 我想说,如果这个版本的 Linux 不支持它,系统调用会返回一个错误。我用单线程循环尝试了您更新的代码,并且线程被固定到单个 cpu。顺便说一句,你能在问题中更新你的代码吗?
猜你喜欢
  • 2014-08-30
  • 2018-05-19
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多