21xrx.com
2024-11-05 16:40:43 Tuesday
登录
文章检索 我的文章 写文章
Linux C++:如何获取线程的CPU ID
2023-07-02 02:04:37 深夜i     --     --
Linux C++ 线程 CPU ID 获取

在编写多线程程序时,了解每个线程运行时所在的 CPU,可以帮助我们更好地优化程序和调试问题。 Linux 环境下,C++ 提供了获取线程 CPU ID 的方法。

获取当前线程 CPU ID

我们可以使用 sched_getcpu() 函数获取当前线程运行时所在的 CPU ID。该函数定义在 头文件中。


#include <sched.h>

int sched_getcpu(void);

该函数的返回值为整型,表示当前线程运行在哪个 CPU 上。如果该值为 -1,则表示函数执行失败。

下面是使用 sched_getcpu() 函数获取当前线程 CPU ID 的示例代码:


#include <iostream>

#include <thread>

#include <sched.h>

void print_cpu_id()

{

  std::cout << "Thread " << std::this_thread::get_id() << " is running on CPU " << sched_getcpu() << std::endl;

}

int main()

{

  std::thread t1(print_cpu_id);

  std::thread t2(print_cpu_id);

  std::thread t3(print_cpu_id);

  t1.join();

  t2.join();

  t3.join();

  return 0;

}

在上面的代码中,定义了一个函数 print_cpu_id(),用来输出当前线程的 ID 和运行所在的 CPU ID。在主函数中启动了三个线程,并分别调用 print_cpu_id() 函数。当程序运行时,会输出如下结果:


Thread 139842501238784 is running on CPU 3

Thread 139842509631488 is running on CPU 6

Thread 139842491409088 is running on CPU 0

可以看到,每个线程都运行在不同的 CPU 上。

获取其他线程 CPU ID

如果需要获取某个特定线程的 CPU ID,可以使用 pthread_getaffinity_np() 函数。该函数定义在 头文件中。


#include <pthread.h>

int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize, cpu_set_t *cpuset);

该函数的第一个参数为线程 ID,第二个参数为 CPU 集合的大小,第三个参数为一个指向 CPU 集合的指针。调用该函数后,线程 ID 对应的 CPU ID 集合会被写入 cpuset 中。

下面是使用 pthread_getaffinity_np() 函数获取其他线程 CPU ID 的示例代码:


#include <iostream>

#include <thread>

#include <sched.h>

#include <pthread.h>

void print_cpu_id()

{

  cpu_set_t cpuset;

  pthread_t thread = pthread_self();

  pthread_getaffinity_np(thread, sizeof(cpu_set_t), &cpuset);

  std::cout << "Thread " << std::this_thread::get_id() << " is running on CPU ";

  for (int i = 0; i < CPU_SETSIZE; i++)

  {

    if (CPU_ISSET(i, &cpuset))

    

      std::cout << i << " ";

    

  }

  std::cout << std::endl;

}

int main()

{

  std::thread t1(print_cpu_id);

  std::thread t2(print_cpu_id);

  std::thread t3(print_cpu_id);

  t1.join();

  t2.join();

  t3.join();

  return 0;

}

在上面的代码中,首先定义了一个 cpu_set_t 变量,并调用 pthread_self() 函数获取当前线程的 ID。然后调用 pthread_getaffinity_np() 函数,将线程 ID 对应的 CPU ID 集合写入 cpuset 变量中。最后,使用 CPU_ISSET() 宏判断某个 CPU 是否包含在集合中,并输出结果。

当程序运行时,会输出如下结果:


Thread 140034345098496 is running on CPU 3

Thread 140034353491200 is running on CPU 6

Thread 140034334827008 is running on CPU 0

可以看到,输出结果和前面的示例代码获取的结果是一样的。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复