TS90 has asked for the wisdom of the Perl Monks concerning the following question:

Hi I was wondering if anyone knows of a way to get the Linux PID of a thread created using threads->create. If I use $$ within the child thread, I always get the parent PID. Using threads->tid() won't give me the Linux PID. I can see all of the child PID's in top or htop, and I want to be able to identify which thread is which PID, if one misbehaves with high CPU usage. Thanks!

Replies are listed 'Best First'.
Re: Get PID of child threads
by oiskuu (Hermit) on Apr 03, 2017 at 22:15 UTC

    Both top and htop will toggle the display of PID/TID when you press 'H'. The header, somewhat confusingly, remains "PID". In reality, the PID is shared between threads. The ps utility has a separate field for thread ID, called "LWP". In any case, this ID is accessible for the thread via gettid, a Linux-specific syscall...

    Here's a snippet that appears to work on my system:

    use threads; sub gettid { use Config; die if $Config{archname} !~ /x86_64-linux/; syscall 186 } sub diag { print "pid=$$ tid=@{[threads->tid]} gettid=@{[gettid]}\n"; } async { diag }->join for 1..5;

    Edit. s/detach/join/, just in case.

      Thanks, that works! The syscall for my OS (arm-linux-gnueabihf-thread-multi-64int) is 224. The following works.
      use threads; sub gettid { syscall 224 } sub diag { print "pid=$$ tid=@{[threads->tid]} gettid=@{[gettid]}\n"; } async { diag }->detach for 1..5;
      pid=16490 tid=1 gettid=16493
      pid=16490 tid=2 gettid=16494
      pid=16490 tid=3 gettid=16495
      pid=16490 tid=4 gettid=16496
      
Re: Get PID of child threads
by Anonymous Monk on Apr 03, 2017 at 21:24 UTC
    Threads are not processes, so they don't have PIDs.
      This is the output from top and htop. Each thread has it's own PID according to those:
      $ top -Hbn1 | grep Control
      16330 root      20   0  200444  74912   5776 S  5.5  7.9   0:06.74 Control.pl
      16316 root      20   0  200444  74912   5776 S  0.0  7.9   0:02.23 Control.pl
      16322 root      20   0  200444  74912   5776 S  0.0  7.9   0:00.00 Control.pl
      16323 root      20   0  200444  74912   5776 S  0.0  7.9   0:00.69 Control.pl
      16324 root      20   0  200444  74912   5776 S  0.0  7.9   0:01.61 Control.pl
      16325 root      20   0  200444  74912   5776 S  0.0  7.9   0:00.70 Control.pl
      16326 root      20   0  200444  74912   5776 S  0.0  7.9   0:01.60 Control.pl
      16327 root      20   0  200444  74912   5776 S  0.0  7.9   0:00.00 Control.pl
      16329 root      20   0  200444  74912   5776 S  0.0  7.9   0:00.08 Control.pl
      
      $ htop
      16312 root       20   0  6184  3024  2716 S  0.0  0.3  0:00.02 │  │        └─ sudo ./Control.pl
      16316 root       20   0  195M 74912  5776 S  3.3  7.9  0:09.58 │  │           └─ /usr/bin/perl ./Control.pl
      16330 root       20   0  195M 74912  5776 S  2.3  7.9  0:04.29 │  │              ├─ /usr/bin/perl ./Control.pl
      16329 root       20   0  195M 74912  5776 S  0.0  7.9  0:00.05 │  │              ├─ /usr/bin/perl ./Control.pl
      16327 root       20   0  195M 74912  5776 S  0.0  7.9  0:00.00 │  │              ├─ /usr/bin/perl ./Control.pl
      16326 root       20   0  195M 74912  5776 S  0.5  7.9  0:01.03 │  │              ├─ /usr/bin/perl ./Control.pl
      16325 root       20   0  195M 74912  5776 S  0.0  7.9  0:00.45 │  │              ├─ /usr/bin/perl ./Control.pl
      16324 root       20   0  195M 74912  5776 S  0.5  7.9  0:01.04 │  │              ├─ /usr/bin/perl ./Control.pl
      16323 root       20   0  195M 74912  5776 S  0.0  7.9  0:00.44 │  │              ├─ /usr/bin/perl ./Control.pl
      16322 root       20   0  195M 74912  5776 S  0.0  7.9  0:00.00 │  │              └─ /usr/bin/perl ./Control.pl
      
        "Each thread has it's own PID according to those"

        Incorrect. Each thread has it's own ID given by something else.

      It depends on the operating system

        As a curious observer on this thread, could you (or someone) provide examples on when a thread would have a pid, and when it wouldn't?

Re: Get PID of child threads
by beech (Parson) on Apr 03, 2017 at 21:23 UTC

    Hi

    Try using POSIX::getpid()

      That gives the same results as using $$.