how to get thread id of a pthread in linux c program?

后端 未结 11 690
忘了有多久
忘了有多久 2020-12-02 07:05

In linux c program, how to print thread id of a thread created by pthread library?
for ex: we can get pid of a process by getpid()

相关标签:
11条回答
  • 2020-12-02 07:47

    What? The person asked for Linux specific, and the equivalent of getpid(). Not BSD or Apple. The answer is gettid() and returns an integral type. You will have to call it using syscall(), like this:

    #include <sys/types.h>
    #include <unistd.h>
    #include <sys/syscall.h>
    
     ....
    
     pid_t x = syscall(__NR_gettid);
    

    While this may not be portable to non-linux systems, the threadid is directly comparable and very fast to acquire. It can be printed (such as for LOGs) like a normal integer.

    0 讨论(0)
  • 2020-12-02 07:50

    pthread_self() function will give the thread id of current thread.

    pthread_t pthread_self(void);
    

    The pthread_self() function returns the Pthread handle of the calling thread. The pthread_self() function does NOT return the integral thread of the calling thread. You must use pthread_getthreadid_np() to return an integral identifier for the thread.

    NOTE:

    pthread_id_np_t   tid;
    tid = pthread_getthreadid_np();
    

    is significantly faster than these calls, but provides the same behavior.

    pthread_id_np_t   tid;
    pthread_t         self;
    self = pthread_self();
    pthread_getunique_np(&self, &tid);
    
    0 讨论(0)
  • 2020-12-02 07:51

    You can also write in this manner and it does the same. For eg:

    for(int i=0;i < total; i++)
    {
        pthread_join(pth[i],NULL);
        cout << "SUM of thread id " << pth[i] << " is " << args[i].sum << endl;
    }
    

    This program sets up an array of pthread_t and calculate sum on each. So it is printing the sum of each thread with thread id.

    0 讨论(0)
  • 2020-12-02 07:55

    There is also another way of getting thread id. While creating threads with

    int pthread_create(pthread_t * thread, const pthread_attr_t * attr, void * (*start_routine)(void *), void *arg);

    function call; the first parameter pthread_t * thread is actually a thread id (that is an unsigned long int defined in bits/pthreadtypes.h). Also, the last argument void *arg is the argument that is passed to void * (*start_routine) function to be threaded.

    You can create a structure to pass multiple arguments and send a pointer to a structure.

    typedef struct thread_info {
        pthread_t thread;
        //...
    } thread_info;
    //...
    tinfo = malloc(sizeof(thread_info) * NUMBER_OF_THREADS);
    //...
    pthread_create (&tinfo[i].thread, NULL, handler, (void*)&tinfo[i]);
    //...
    void *handler(void *targs) {
        thread_info *tinfo = targs;
        // here you get the thread id with tinfo->thread
    }
    
    0 讨论(0)
  • 2020-12-02 07:58

    This single line gives you pid , each threadid and spid.

     printf("before calling pthread_create getpid: %d getpthread_self: %lu tid:%lu\n",getpid(), pthread_self(), syscall(SYS_gettid));
    
    0 讨论(0)
提交回复
热议问题