一、Linux 获取线程ID
使用syscall获取lwp,也就是top -H中看到的id,但也要注意syscall造成的的开销:
//实例1
#include <iostream>
#include <unistd.h>
#include <sys/syscall.h>
using namespace std;
int main()
{
int tid = syscall(SYS_gettid);
cout << tid <<endl;
return 0;
}
//实例2
#include <stdio.h>
#include <sys/syscall.h> //Linux system call for thread id
#include <assert.h>
#include <pthread.h>
void *subThread()
{
int i;
printf("child thread lwpid = %u\n", syscall(SYS_gettid));
printf("child thread tid = %u\n", pthread_self());
scanf("%d", i);//code dump
}
int main()
{
pthread_t tid;
int rc;
printf("main thread lwpid = %u\n", syscall(SYS_gettid));
printf("main thread tid = %u\n", pthread_self());
rc = pthread_create(&tid, NULL, subThread, NULL);
assert(0 == rc);
pthread_join(tid, NULL);
return 0;
}
注:syscall(SYS_gettid),这个方法所获取的lwpid,正是在top中显示出来的 PID。
二、Windows 获取线程ID
c++11的thread库提供了获取tid的接口:std::this_thread::get_id(),这个接口返回的是一个内存地址指向表述线程的结构体(pthread也是一样)。
//实例1
#include <iostream>
#include <thread> // get_id()头文件,std::thread, std::thread::id, std::this_thread::get_id
#include <chrono> // std::chrono::seconds
#include <mutex>
std::mutex g_display_mutex;
void foo()
{
std::thread::id sTheadId = std::this_thread::get_id(); //无参数,返回当前线程ID
g_display_mutex.lock();
std::cout << "thread " << sTheadId << " sleeping...\n";
g_display_mutex.unlock();
std::this_thread::sleep_for(std::chrono::seconds(1));
}
int main()
{
std::thread t1(foo);
std::thread t2(foo);
t1.join();
t2.join();
}
C++获取线程ID的两种方式
1、获取当前线程的线程ID
2、获取声明的线程变量的线程ID(特定线程)
//实例2
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <thread>
#include <windows.h>
using namespace std;
void hello()
{
Sleep(2000);
cout << "hello world!" << endl;
}
int main()
{
thread t(hello);
thread::id thread_id = t.get_id(); // 获取特定线程的id
thread::id this_thread_id = this_thread::get_id(); //获取本线程的id(无参数,返回当前线程ID)
cout << "thread id = " << thread_id << endl;
cout << "this thread id = " << this_thread_id << endl;
t.join();
return 0;
}
参考链接:https://blog.csdn.net/weixin_43869898/article/details/107456236