精华内容
下载资源
问答
  • 2021-04-23 14:45:47

    我们通常使用的threading.currentThread().ident,获取的是threading对象的标识ident,而并非系统线程ID。

    那么怎么才能获取系统线程ID呢?

    答案:

    使用ctypes调用系统的动态链接库libc.so.6 来获取线程id。

    参考:http://blog.devork.be/2010/09/finding-linux-thread-id-from-within.html

    python代码示例:

    import ctypes
    
    SYS_gettid = 186
    libc = ctypes.cdll.LoadLibrary('libc.so.6')
    tid = libc.syscall(SYS_gettid)

     

    更多相关内容
  • 线程ID与线程句柄有啥不同

    千次阅读 2020-06-24 09:44:12
    线程句柄与线程ID的区别: ●CreateThread() API 用于创建线程。 API 返回同时线程句柄和线程标识符 (ID)。 线程句柄有完全访问权创建线程对象。 运行线程时线程 ID 唯一标识线程在系统级别。 ●ID是在Windows系统...

    当某个程序创建一个线程后,会产生一个线程的句柄,线程的句柄主要用来控制整个线程的运行,例如停止、挂起或设置线程的优先级等操作。

    线程句柄与线程ID的区别:

    ●CreateThread() API 用于创建线程。 API 返回同时线程句柄和线程标识符 (ID)。 线程句柄有完全访问权创建线程对象。 运行线程时线程 ID 唯一标识线程在系统级别。
    ●ID是在Windows系统范围内唯一标示Thread的。
    ●Handle是用来操作Thread的,可以有多个,每个HANDLE可以有不同的操作权限,在不同进程OpenThread得到的值不一样。
    ●线程的ID是系统全局的,其HANDLE是进程局部的.

    ●此ID只在线程的生存期内有效。

    ●HANDLE是os和client之间用来操作进程和线程一个桥梁,os有一张维护HANDLE的表单,里面大概放置了 HANDLE的引用计数和有关的属性,HANDLE是os标识进程和线程的东西,但是用户也可以用这个来标识进程和线程,对其操作;而ID是os用来标识进程和线程的,并且是全局唯一的, 但用户可以通过这个ID获得进程线程的HANDLE,多次得到的HANDLE并不一定是一样的.HANDLE是内核对象,而ID好像不是,并没有专门创建ID的函数.

    ●ID是CreateThread时操作系统自动生成的。

    ●线程的句柄和id是不同的。
    在windows系统中,线程的id是唯一对应的,也就是说,如果两个线程返回相同的id,则他们必然是同一线程,反之一定是不同的线程。而线程的句柄并不是线程的唯一标识,线程的句柄只是用来访问该线程的的一个32位值,尽管相同的句柄一定标识同一线程,但同一线程可能拥有两个打开的句柄,因此,不能用句柄来区分两个线程是否是同一线程。

    什么是句柄:

    句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。但是,如果您真的这样认为,那么您就大错特错了。我们知道,Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化,我们该到哪里去找该对象呢?
    为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。
    句柄地址(稳定)→记载着对象在内存中的地址→对象在内存中的地址(不稳定)→实际对象

    线程与线程句柄的关系:

    句柄可以认为是系统对资源(如线程)的分配的一个编号。关闭这个编号,对于不同的资源,效果不尽相同。对于线程来说,关闭这个编号并不意味着终止线程,只是之后很难再操纵这个线程。

    原文:线程ID与线程句柄区别

    展开全文
  • 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:...

    以下代码获取的threadId其实是jvm里的线程id,和我们常说的linux系统线程id不一样

    public static void main(String[] a) {

    long tid = Thread.currentThread().getId();

    System.out.println("tid:"+ tid);

    }

    打印结果

    tid:1

    从结果看明显id不是我们想要的系统线程id。系统线程id可以借助jni调用c去获取

    首先定义包含native方法的java文件GetThreadID.java

    public class GetThreadID {

    public static native int getTid();

    static {

    System.loadLibrary("GetThreadID");

    }

    }

    然后定义c函数文件GetThreadID.c

    #include

    #include

    #include

    #include "GetThreadID.h"

    JNIEXPORT jint JNICALL

    Java_GetThreadID_get_1tid(JNIEnv *env, jobject obj) {

    jint tid = syscall(__NR_gettid);

    return tid;

    }

    最后改下我们获取线程的测试类test.java

    public static void main(String[] a) {

    long tid = GetThreadID.getTid();

    System.out.println("tid:"+ tid);

    }

    执行如下命令编译和执行测试类

    JAVA_HOME2=$(readlink -f /usr/jdk/bin/javac | sed "s:bin/javac::")

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

    javac GetThreadID.java

    javah GetThreadID

    gcc -I${JAVA_HOME2} -fPIC -shared GetThreadID.c -o libGetThreadID.so

    javac test.java

    java test

    最后打印了系统线程id

    tid:13141

    展开全文
  • 线程ID与进程ID

    千次阅读 2018-05-20 15:26:58
    进程ID和线程ID1. 内核标识的线程ID-LWP,在系统级别有效 在Linux下,目前的线程实现是Native POSIX Thread Libaray,简称NPTL。在这种实现下,线程又被称为轻量级进程。每一个用户态的线程,在内核中都对应一个...

    进程ID和线程ID

    1. 内核标识的线程ID-LWP,在系统级别有效
            在Linux下,目前的线程实现是Native POSIX Thread Libaray,简称NPTL。在这种实现下,线程又被称为轻量级进程。每一个用户态的线程,在内核中都对应一个调度实体,也拥有自己的进程描述符(task_struct结构体)。
            没有线程之前,一个进程对应内核中一个进程描述符,对应一个进程ID。但是引入线程的概念之后,一个用户进程下管辖N个用户态线程。每个线程作为一个独立的调度的实体,在内核态中都有自己的进程描述符,进程和内核描述符一下变成了1:N的关系。POSIX标准又要求同一进程中的线程调用getpid函数时返回相同的进程ID,如何解决上述问题呢?
            Linux内核就引入了线程组的概念:
    struct task_struct
      {
        ...                                                                                                                                                               
          pid_t pid;
          pid_t tgid;
          ... 
          struct task_struct* group_leader;
          ... 
          struct list_head thread_group;
          ... 
    }
    

            多线程的进程,又被称为 线程组。线程组内每一个线程在内核中都有一个进程描述符(task_sruct)与之对应,且进程描述符结构体中的pid对应的是线程id,而非进程id。进程描述符中的tgid含义是Thread Group ID,对应的是用户级的进程id。
            现在介绍的线程ID,不同于pthread_t类型的线程ID,和进程ID一样,线程ID是pid_t类型的变量,而且是用来唯一标识线程的一个整型变量。如何看一个线程的ID呢?
    如上图所示,我们查看了thread_id进程中的线程相关信息。(最后一行不是)ps命令中的-L选项,会显示如下信息:
    (1)LWP:线程ID,即getttid( )系统调用的返回值;
    (2)NLWP:线程组内线程的个数

    可以看出来,thread_id进程是多线程的,进程ID是6538,进程内有两个线程,线程ID分别是6538、6539。
            Linux提供了gettid系统调用来返回其线程ID,可是glibc并没有将该系统调用封装起来,在开放接口来供程序员使用,如果确实需要获得该线程ID,可采用以下方法:
    #include <sys/syscall.h>
    pid_t tid;
    tid = syscall(SYS_gettid);      

    我们用以下方法测试如下代码的线程ID:
    //所有线程的pid都是进程的pid,均相同                                                                                                                                    
    #include <stdio.h>
    #include <pthread.h>
    #include <unistd.h>
    #include <sys/syscall.h>
    
    void* thread_run(void* arg)//传入线程创建的函数
    {   
        pid_t tid = syscall(SYS_gettid);
        const char* msg = (const char*)arg;
        printf("%s: %d\n", msg, tid);
        sleep(5);
        
        pthread_exit((void*)0);
    }
        
    int main()
    {   
        pthread_t tid1, tid2, tid3;//无符号长整型
        pthread_create(&tid1, NULL, thread_run, "thread 1");
        pthread_create(&tid2, NULL, thread_run, "thread 2");
        pthread_create(&tid3, NULL, thread_run, "thread 3");
     
        pthread_join(tid1, NULL);//不关心线程退出信息
        pthread_join(tid2, NULL);
        pthread_join(tid3, NULL);
        
        printf("main thread: tid:%x, pid:%d\n", pthread_self(), getpid());
        sleep(5);
        return 0;
    }
    

    运行结果为:
    可以看到该进程中有一个主线程、三个新线程,打印出来的结果也是四个线程,线程ID分别为6825、6826、6827、6828。结果与我们上面用ps命令查看得到的线程ID一样,所以这里打印的线程ID即为LWP,在内核有效。
            6825标识的即为主线程,在内核中被叫做group leader,内核在创建第一个线程时,会将线程组的ID值设置为第一个线程的线程ID,group leader的指针指向自身,即主线程的进程描述符, 所以线程组内存在一个线程ID与进程ID相等,该线程即为线程组的主线程
            线程组内的其他线程ID则由内核分配,但是线程组ID和主线程的线程组ID一样,无论是主线程创建新线程,还是新线程再创建新线程,都是这样。
            但是,线程与 进程不一样,进程间有父子关系,但是线程之间均为对等关系,即 同一个线程组的线程,没有层次关系

    2. 用户级别的线程ID
            pthread_create函数会产生一个线程ID,存放在第一个函数所指向的地址中,这里的线程ID即为用户级别的线程ID。上面说的ID属于进程调度的范畴,因为线程属于轻量级线程,是操作系统调度的最小单位,所以需要一个数值来唯一标识该线程。而pthread_create产生并标记在第一个参数指向的地址中的线程ID,属于NPTL线程库的范畴。线程库的后序操作,就是根据该线程ID来操作线程的,它仅在当前库内有效。
            线程库NPTL提供了pthread_self函数,可获得线程自身的ID:
    pthread_t pthread_self(void);           
            对于Linux目前实现的NPTL实现来讲, pthread_t类型的线程ID,本质上是进程地址空间上的一个地址

    我们利用pthread_self编写代码查看用户级别线程的ID:
    //所有线程的pid都是进程的pid,均相同
    #include <stdio.h>
    #include <pthread.h>
    #include <unistd.h>
    #include <sys/syscall.h>
    
    void* thread_run(void* arg)//传入线程创建的函数
    {
        const char* msg = (const char*)arg;                                                                                                                                     
        //这里打印出tid是地址的形式,是用户级的线程id,只在当前库内有效
        printf("%s: tid:%#x, pid:%d\n", msg, pthread_self(), getpid());
        sleep(5);
    
        pthread_exit((void*)0);
    }
    
    int main()
    {
        pthread_t tid1, tid2, tid3;//无符号长整型
        pthread_create(&tid1, NULL, thread_run, "thread 1");
        pthread_create(&tid2, NULL, thread_run, "thread 2");
        pthread_create(&tid3, NULL, thread_run, "thread 3");
        
        pthread_join(tid1, NULL);//不关心线程退出信息
        pthread_join(tid2, NULL);
        pthread_join(tid3, NULL);
        
        printf("main thread: tid:%x, pid:%d\n", pthread_self(), getpid());
        sleep(5);
        return 0;
    }
    

    运行结果为:

    展开全文
  • QT获取线程ID的方法

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

    千次阅读 2021-03-08 02:26:04
    接受的答案回答有关获取a线程ID的问题,但它不会让您执行“Y的线程X”消息。线程ID是跨线程唯一的,但并不一定从0或1此处开始是一个示例匹配的问题:import java.util.concurrent.*;class ThreadIdTest {public ...
  • 现在项目中有这样一个需求,政府需要对辖区内的...需要中断这个线程,我在开线程的时候已经有了线程Id,看网上说ThreadGroup是可以的,但是已经被废弃了,不推荐使用,不知道有没有其他办法中断某个具体的线程的,求教
  • 获取线程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 通过自定义切面,拦截有注解@LogId的请求,附加会话ID输出到日志。 加入POM引
  • linux下的线程ID和进程ID

    千次阅读 2018-05-21 19:44:58
    在描述线程ID和进程ID之前我们先来分清楚几个概念: 1. 用户级线程和内核级线程 什么是用户级线程? 用户级线程内核的切换由用户态程序自己控制内核切换,不需要内核干涉,少了进出内核态的消耗,但不能很好的...
  • 命令查看多线程所有线程ID

    万次阅读 2020-08-25 22:25:46
    在ps命令中,“-T”选项可以开启线程查看。下面的命令列出了由进程号为<pid>的进程创建的所有线程。 ps -T -p <pid> 方法二: Top top命令可以实时显示各个线程情况。要在top输出中开启线程查看,请...
  • SpringBoot处理内外事务及线程ID使用

    千次阅读 2019-09-09 17:30:34
     因为线程的特性,在请求未结束前,线程ID是不会被占用和复用的,这样在请求日志中可以在redis中用线程ID作为key进行数据存储,在过滤器中获取响应数据,然后通过线程ID获取缓存数据再次更新,等待操作结束存入静态...
  • 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...
  • 我们采用GetWindowThreadProcessId来获取窗口线程ID.获取与指定窗口关联在一起的一个进程和线程标识符 找出某个窗口的创建者(线程或进程),返回创建者的标志符。 视频链接 511遇见易语言模块API教程 api ...
  • C++获取线程ID的两种方式

    千次阅读 2020-07-20 20:41:10
    1、获取当前线程的线程ID 2、获取声明的线程变量的线程ID
  • python3 获取 进程id 线程id

    万次阅读 2020-01-21 09:52:53
    1.获取线程id import threading # 1 获取线程ID,NAME t = threading.currentThread() #线程ID print('Thread id : %d' % t.ident) #线程NAME print('Thread name : %s' % t.getName()) 输出: Thread id : ...
  • 线程句柄HANDLE与线程ID的关系

    千次阅读 2019-04-29 17:39:57
     //至此,新线程,线程句柄,线程ID产生 TerminateThread(hThread, 0); //至此,线程ID,线程句柄都依然存在 WaitForSingleObject(hThread, INFINITE); //至此,线程本身和线程ID消失 CloseHandle(hThread); //...
  • python 中获取线程id

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

    千次阅读 2018-10-19 16:07:50
    在线程中,线程ID的类型是pthread_t类型,由于在Linux下线程采用POSIX标准,所以,在不同的系统下,pthread_t的类型是不同的,比如在ubuntn下,是unsigned long类型,而在solaris系统中,是unsigned int类型。...
  • C++ 一句代码打印当前线程ID

    千次阅读 2020-04-02 03:06:38
    我们要获取线程id,那么必然要用到get_id这个函数,那么我们看看这个函数返回的是什么。 看到了吗, _Thrd_id()其实是一个uint32_t类型的返回值,但是却被转换成了thread::id类型, 那么我们再来看看thread::i...
  • java根据线程id获取线程

    千次阅读 2019-07-04 14:43:00
    /** * 通过线程组获得线程 * * @param threadId * @return */ public static Thread findThread(long threadId) { ThreadGroup group = Thread.currentThread().getThread...
  • Linux获取线程id的方法

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

    千次阅读 2020-08-06 16:19:05
    参考 https://www.cnblogs.com/juforg/p/3488740.html
  • Linux打印线程ID

    千次阅读 2019-06-12 15:31:18
    Linux下多线程程序发生coredump时,用 gdb /path/to/program/file core 可以看到所有线程 root@rubic:~/test/thread# gdb a.out core GNU gdb (GDB) 7.6.1 Copyright © 2013 Free Software Foundation, Inc. ...
  • win32 pthread:获取线程 id

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

    千次阅读 2020-05-24 09:08:02
    有些时候,需要在Log中打出...获取线程ID // 方法1 #include <sys/syscall.h> syscall(__NR_gettid) // 方法2 #include <sys/syscall.h> #define gettid() syscall(__NR_gettid) // 方法3 #include &l
  • QT获取当前线程ID

    万次阅读 2019-09-25 09:01:43
    QT获取当前线程ID 用QSerialPort串口类的时候出现了: [WARNING ] QObject: Cannot create children for a parent that is in a different thread. (Parent is QSerialPort(0x505f250), parent’s thread is QThread...
  • c语言库 process.h 中的函数, 用来创建一个线程 unsignedlong_beginthreadex( void*security,//安全属性,为NULL时表示默认安全性 unsignedstack_size,//线程的堆栈大小,一般默认为0 ....
  • C#/.NET 获取当前线程ID

    千次阅读 2019-06-06 14:57:14
    using System.Threading; ... public string GetCurrentThreadID() { return Thread.CurrentThread.ManagedThreadId.ToString("00"); }

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 833,347
精华内容 333,338
关键字:

线程id

友情链接: S_Transformation.zip