精华内容
下载资源
问答
  • 获取线程id
    2021-12-07 14:24:41

    一、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

    更多相关内容
  • 获取线程ID的方法

    千次阅读 2020-11-27 10:49:47
    #获取线程ID的方法 获取线程ID的方法Linuxphread_createpthread_selfsyscallWindows_beginthreadexGetCurrentThreadIDC++11std::this_thread::get_id和std::thread::get_id Linux phread_create 调用pthread_create...

    #获取线程ID的方法

    Linux

    phread_create

    调用pthread_create函数时,第一个参数在函数调用成功后可以得到线程ID:
    
    #include <pthread.h>
    // 线程ID
    pthread_t id;
    pthread_create(&id,NULL,thread_fun,NULL);
    

    此方法获取的ID是一块内存地址,不是全系统唯一的,一般是一个很大的数字(内存地址)。

    pthread_self

    在需要获取ID的线程中,调用pthread_self()函数获取线程:
    
    #include <pthread.h>
    // 线程ID
    pthread_t id = pthread_self();
    

    此方法同pthread_create相同。

    syscall

    使用系统函数获取线程ID:
    
    #include <sys/syscall.h>
    #include <unistd.h>
    // 线程ID
    int id = syscall(SYS_gettid);
    

    此方法获取的线程ID是系统范围内全局唯一的,一般是一个不会太大的整数。
    具体区别:

    #include <sys/syscall.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <pthread.h>
    
    void *thread_fun(void* arg)
    {
    	pthread_t *id1 = (pthread_t*)arg;
    	pthread_t id2 = pthread_self();
    	int id3 = syscall(SYS_gettid);
    	printf("id1:%ld,id2:%ld,id3:%ld\n",id1,id2,id3);
    	while(true)
    	{
    		sleep(1);
    	}
    }
    
    int main()
    {
    	pthread_t id;
    	pthread_create(&id,NULL,thread_fun,&id);
    	pthread_join(id,NULL);
    	return 0;
    }
    
    执行结果:id1: 140185007511296, tid2: 140185007511296, tid3: 60837
    

    Windows

    _beginthreadex

    调用函数_beginthreadex创建线程,最后一个参数返回线程ID:
    
    //线程ID
    unsigned int thID;
    HANDLE *hth;
    hth = (HANDLE)_beginthreadex(NULL, 0, threadFun, NULL, 0, &thID);
    

    GetCurrentThreadID

    在需要获取线程代码段中,调用GetCurrentThreadID函数获取当前所在的线程ID:
    
    //线程ID
    DWORD id = GetCurrentThreadID();
    

    C++11

    std::this_thread::get_id和

    使用std::this_thread类的get_id方法获取当前线程ID:
    
    //线程ID
    #include <thread>
    #include <iostream>
    #include <sstream>
    void thread_fun();
    int main()
    {
    	std::thread thread_(thread_fun);
    	std::thread::id thread_id = thread_.get_id();
    }
    

    std::thread::get_id

    使用std::thread类的get_id方法获取指定线程ID:
    
    //线程ID
    #include <thread>
    #include <iostream>
    #include <sstream>
    int main()
    {
    	//线程ID
    	std::thread::id thread_id = std::this_thread::get_id();
    }
    

    ** 使用get_id方法返回的是一个包装类型的std::thread::id对象,不可以直接强转成整型,也没有提供任何转换整型的接口,因此,一般使用std::cout将id值打印出来。或者先转换为:std::ostringstream对象,再转换成字符串类型,然后再把字符串类型转换成整型.**

    //线程ID
    #include <thread>
    #include <iostream>
    #include <sstream>
    void worker_thread_func()
    {
    	 while (true)
    	 {
    	 }
    }
    int main()
    {
    	std::thread t(worker_thread_func);
    	//获取线程 t 的 ID
    	std::thread::id worker_thread_id = t.get_id();
    	std::cout << "worker thread id: " << worker_thread_id << std::endl;
    	//获取主线程的线程 ID
    	std::thread::id main_thread_id = std::this_thread::get_id();
     	//先将 std::thread::id 转换成 std::ostringstream 对
    	std::ostringstream oss;
     	oss << main_thread_id;
     	//再将 std::ostringstream 对象转换成 std::string
    	std::string str = oss.str();
    	//最后将 std::string 转换成整型值
     	int threadid = atol(str.c_str());
     	std::cout << "main thread id: " << threadid << std::endl;
     	while (true)
    	{
    		//权宜之计,让主线程不要提前退出
    	}
    	return 0;
    }
    

    摘自《C/C++多线程编程精髓》

    展开全文
  • 获取线程ID两种方法

    千次阅读 2021-09-22 10:31:47
    gettid 获取的是内核中线程ID,而pthread_self 是posix描述的线程ID。 二:直接调用pthread_self() 求父子主进程和其所属进程 id #include<stdio.h> #include<pthread.h> #include<unistd.h> //...

    一:gettid()函数
    gettid 获取的是内核中线程ID,而pthread_self 是posix描述的线程ID。
    二:直接调用pthread_self()
    求父子主进程和其所属进程 id

    #include<stdio.h>
    #include<pthread.h>
    #include<unistd.h>
    
    //由于pthread用户库内没有gettid()所以需要这个头文件以及下面的函数定义
    #include<sys/syscall.h>
    pid_t gettid()
    {
         return syscall(SYS_gettid);
    }
    
    void *f(void *arg) {
    
        if(*(int *)arg){
            printf("tid 父进程所属线程 ID 为 %d\n",gettid());
            printf("pid 父进程所属线程 ID 为 %ld\n",pthread_self());
        }
        else{
            printf("tid 子进程所属线程 ID 为 %d\n",gettid());
            printf("pid 子进程所属线程 ID 为 %ld\n",pthread_self());
        }
        pthread_exit(NULL);
    
    }
    int main(){
        pid_t pid1;
        pthread_t tid1;
        pthread_t tid2;
        int *retval_1;
        int *retval_2;
        int a;
        pid1 = fork();
        
        if(pid1 == 0){
            a = 0;
            printf("pid 子进程主线程 ID 为 %ld\n",pthread_self());
            printf("tid 子进程主线程 ID 为 %d\n",gettid());
            pthread_create(&tid1,NULL,f,(void *)&a);
        }
        else{
            a = 1;
            printf("pid 父进程主线程 ID 为 %ld\n",pthread_self());
            printf("tid 父进程主线程 ID 为 %d\n",gettid());
            pthread_create(&tid2,NULL,f,(void *)&a);
        }
        pthread_join(tid1,(void*)retval_1);
        pthread_join(tid2,(void*)retval_2);
    }
    

    编译:在这里插入图片描述
    pthread_self 是posix描述的线程ID(并非内核真正的线程id),相对于进程中各个线程之间的标识号,对于这个进程内是唯一的,而不同进程中,每个线程的 pthread_self() 可能返回是一样的。
    而 gettid 获取的才是内核中线程ID

    展开全文
  • Linux下获取线程id的靠谱方法

    Linux下编写多线程程序时一般都会用POSIX threads库,这个库提供了一个类型pthread_t来标识线程id,但是这个类型比较怪异,如下,摘自stackoverflow,
    在这里插入图片描述
    可以看出pthread_t有可能是一个数值类型,也有可能是一个结构体,因此POSIX threads库专门提供了一个函数来比较pthread_t类型,即pthread_equal(),但是这样就产生很多弊端,以下是摘自陈硕的《Linux多线程服务端编程》,

    • 无法打印输出pthread_t,因为不知道其确切类型,也就没法在日志中用它表示当前线程的id
    • 无法比较pthread_t的大小或计算其hash值,因此无法用作关联容器的key
    • 无法定义一个非法的pthread_t值,用来表示绝对不可能存在的线程id…
    • pthread_t值只在进程内有意义,与操作系统的任务调度之间无法建立有效关联。比方说在/proc文件系统中找不到pthread_t对应的task

    靠谱方法

    使用gettid()来获取线程id,其类型是一个小整数(最大值是/proc/sys/kernel/pid_max,默认是32768),但是glibc并没有封装这个系统调用,需要自己封装一下,如下这种,

    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/syscall.h>
    
    pid_t gettid(void)
    {
        return (pid_t)syscall(__NR_gettid);
    }
    
    展开全文
  • QT获取线程ID的方法

    千次阅读 2021-03-19 09:17:48
    线程ID获取可以通过调用QT函数currentThreadId()或者WinAPI函数GetCurrentThreadId(),示例代码如下: #include <QDebug> #include <processthreadsapi.h> qDebug() << GetCurrentThreadId() &...
  • 如何从线程池中获取线程ID

    千次阅读 2021-03-08 02:26:04
    接受的答案回答有关获取a线程ID的问题,但它不会让您执行“Y的线程X”消息。线程ID是跨线程唯一的,但并不一定从0或1此处开始是一个示例匹配的问题:import java.util.concurrent.*;class ThreadIdTest {public ...
  • linux获取线程ID

    千次阅读 2018-11-15 18:30:24
    //获取线程ID: #include &lt;sys/syscall.h&gt; syscall(SYS_gettid); //获取到的线程号与top H的线程号一样 #if defined(OS_LINUX) #include &lt;unistd.h&gt; #include &lt;sys/syscall.h&...
  • python 中获取线程id

    万次阅读 2018-07-02 16:00:50
    1、python下使用ctypes获取threading线程idpython的多线程坑坑不断… …python的threading因为封装的太好, 很多本源的东西在threading对象里是拿不到的. 首先需要说明的是python threading的name跟ident,这些看起来...
  • Linux获取线程id的方法

    千次阅读 2019-07-28 16:38:27
    最近一直在想: ...通过查看资料,发现一种比较简单的方法就是在代码中使用printf将当前线程id打印出来。 而这也分成两种情况: 1. 如果是pthread,则使用, #include <pthread.h> pthread_...
  • C++获取线程ID的两种方式

    千次阅读 2020-07-20 20:41:10
    1、获取当前线程的线程ID 2、获取声明的线程变量的线程ID
  • 线程ID 获取Rust中当前线程的唯一ID。 对于诊断和调试,获取每个线程不同的ID通常很有用。 ,标准库还没有公开执行此操作的方法,因此没有这种方法。 例子 use std :: thread; use thread_id; let handle = ...
  • C++ 线程 获取线程id

    千次阅读 2020-03-11 13:51:33
    void foo() { std::thread::id this_id = std::this_thread::get_id(); unsigned int t = *(unsigned int*)&this_id;// threadid 转成 unsigned int unsigned int threadid = t; g_display_mutex.lock(); std::cout...
  • win32 pthread:获取线程 id

    千次阅读 2018-10-09 16:14:17
    的这个版本区别,所以在写跨平台的代码时要获取线程id,就要区别对待,如下: static inline unsigned int pthread_id ( ) { # ifdef PTW32_VERSION return pthread_getw32threadid_np ( pthread_...
  • Golang 语言如何获取线程ID(Thread ID)?

    万次阅读 2018-10-18 14:25:43
    Golang 性能测试,发现多核机器一直不能跑满,单核机器可以跑满,集合https://blog.csdn.net/liangzhiyang/article/details/52669851?utm_source=blogxgwz3 的调度理论,想看下...linux 环境获取threadID的方法如下...
  • java 获取线程id

    千次阅读 2017-05-04 16:04:00
    如何获取正在运行的线程ID? 解决方法 下面的示例演示如何使用getThreadId() 方法一个正在运行线程ID。 public class Main extends Object implements Runnable { private ThreadID var; public Main(Thread...
  • std::ostringstream oss; oss &lt;&lt; std::this_thread::get_id(); std::string stid = oss.str(); unsigned long long tid = std::stoull(stid);
  • ① boost::thread::id 的对象能够用来标识线程,每个正在运行的线程都可以获取一个唯一可用的线程id,可以通过调用 boost::thread 的成员函数 get_id(),或者通过在线程中调用 boost:this_thread::get_id()。...
  • Android C++获取线程id,进程id

    千次阅读 2018-05-14 21:06:21
    Android 在c++代码里边获取pid,tid:#include &lt;sys/syscall.h&gt; int tid = (int)syscall(SYS_gettid); int pid = (int)syscall(SYS_getpid);
  • 函数原型: #include&lt;pthread.h&gt; int pthread_create(pthread_t*thread,pthread_attr_t *attr, ... 第一个参数为指向线程标识符的指针。  第二个参数用来设置线程属性。  第三个参数是线...
  • MFC 获取线程ID

    千次阅读 2014-05-15 15:10:07
    于是网上找各种获取线程ID的方法,把找到的几种写下来方便以后用   1.通过进程映射名称获取主线程ID(进程映射名应为全大写,如谷歌浏览器的进程名:CHROME.EXE)   DWORD WINAPI GetThreadIDByName...
  • 以下实例演示了如何使用 getThreadId() 方法获取线程id:public class Main extends Object implements Runnable { private ThreadID var; public Main(ThreadID v) { this.var = v; } public void run() { ...
  • java获取真实线程id

    千次阅读 2021-03-16 21:57:58
    以下代码获取的threadId其实是jvm里的线程id,和我们常说的linux系统线程id不一样public static void main(String[] a) {long tid = Thread.currentThread().getId();System.out.println("tid:"+ tid);}打印结果tid:...
  • python 获取当前线程的系统线程ID

    千次阅读 2021-04-23 14:45:47
    使用ctypes调用系统的动态链接库libc.so.6 来获取线程id。 参考: python代码示例: import ctypes SYS_gettid = 186 libc = ctypes.cdll.LoadLibrary('libc.so.6') tid = libc.syscall(SYS_ge
  • python3 获取 进程id 线程id

    千次阅读 2020-11-24 08:30:40
    1.获取线程idimport threading# 1 获取线程ID,NAMEt = threading.currentThread()#线程IDprint('Thread id : %d' % t.ident)#线程NAMEprint('Thread name : %s' % t.getName())输出:Thread id : 7080Thread name : ...
  • Linux C获取线程ID

    千次阅读 2013-07-29 11:35:00
    获取当前调用线程的 thread identifier(标识号). #include int main() {  pid_t pid;  pthread_t tid;  pid = getpid();  tid = pthread_self();  printf("pid %u tid %u (0x%x)\n", (unsigned int)pid, ...
  • 日常随笔——C++中获取当前线程ID

    千次阅读 2022-01-12 00:22:28
    参考链接:Linux下获取线程ID #include <pthread.h> #include <thread> #include <iostream> #include <unistd.h> #include <stdio.h> #include <sys/syscall.h> #define ...
  • 获取线程Id的方法

    千次阅读 2018-08-22 21:24:24
    编译时,宏展开之后,相当于定义了一个pid_t gettid(void)函数,用内嵌汇编实现,在程序中就可以使用gettid()获得线程id了。    第二种:syscall(), 名字叫syscall(),却是glibc中的库函数。 (recommend) ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 475,696
精华内容 190,278
关键字:

获取线程id

友情链接: 2d-extras-master.zip