2011-09-01 2 views
11

からpidを取得する方法は、すべてのpthreadがpidにマッピングされているため、htopなどのツールで監視できます。しかし、どうすればスレッドのPIDを得ることができますか? getpid()はメインスレッドのpidを返します。RH Linuxのpthread

+0

[LinuxのNPTL 2.6置き換えLinuxThreadsの(http://drdobbs.com/open-source/184406204)、Linuxは今POSIXに従い、正しくスレッドごとに同じPIDを返します。 –

+2

有用であると思われる回答を「受け入れる」ことを検討する必要があります。 –

+0

Steve-o:Linuxでも、スレッドごとに別々のプロセスが作成されます(各スレッドは独自の/ proc/を取得します。はメインスレッド/プロセスと異なります) – Rahly

答えて

10

pthread_self();

は、呼び出しスレッドのIDを返すために呼び出すことができます。

また、PIDはプロセスIDです。スレッドにはPIDではなくスレッドIDがあります。同じプロセスで実行されているすべてのスレッドは同じPIDを持ちます。

+13

あなたが言っていることは間違っているからです。 Linuxスレッドは軽量プロセスなので、実際にはpidで表すことができます。実際、以下の関数はLinux unistd.hに存在します:pid_t gettid(void)。一方、Windowsは真の独立したスレッドIDを持っています。 – ThreeBit

2

PIDはプロセスIDであり、スレッドIDではありません。同じプロセスで実行されるスレッドは、明らかにすべてが同じPIDに関連付けられます。

pthreadsは移植性があるため、基礎となるOSスレッドのIDを直接取得することはできません。基礎となるOSスレッドが存在しない可能性もあります。

+0

NPTLスレッドはもはやプロセスとして登録されています。 –

0

スレッドがTIDS(threadIds)を持っており、すべてのスレッドが同じプロセス(PID)で実行していると思います。したがって、スレッドは同じプロセスで作成されていると仮定して、すべて同じpidを持つ必要があります。異なるtidを持つことになります。

pthread_self()はtidを返し、getpid()はpidを取得します。

22

混乱するスレッド値は2つあります。 pthread_self()はPOSIXスレッドIDを返します。 gettid()はOSスレッドIDを返します。後者はLinux特有のもので、移植性は保証されていませんが、おそらくあなたが探しているものでしょう。

EDIT PlasmaHH注釈のとおり、からgettid()が呼び出されます。 syscall() manページから:

#define _GNU_SOURCE 
    #include <unistd.h> 
    #include <sys/syscall.h> 
    #include <sys/types.h> 

    int 
    main(int argc, char *argv[]) 
    { 
     pid_t tid; 

     tid = syscall(SYS_gettid); 
    } 
+0

gettid()にはglibcラッパーがなく、syscall()によって呼び出される必要があることに注意してください。 – PlasmaHH

+0

@ PlasmaHH - それを追加する必要があります。偶然にも、システムコールのマニュアルページではそれを例として使用しています。 – Duck

+0

gettid()は一種の[論争の的です](http://airlied.livejournal.com/74826.html) –

1

pthread_selfはないはTIDを取得しています。 pthread関数での使用のために、pthread_t型のハンドルまたはポインタを提供します。

現実世界のプログラムが返すかもしれないものの例はこちらをご覧:

http://www.c-plusplus.de/forum/212807-full

1

実際にあなたと働くことができるpthread_selfリターンpthread_tはなく整数スレッドID、以下のヘルパー関数がでていること、あなたを取得します異なるPOSIXシステム間で移植可能な方法です。

uint64_t gettid() { 
    pthread_t ptid = pthread_self(); 
    uint64_t threadId = 0; 
    memcpy(&threadId, &ptid, std::min(sizeof(threadId), sizeof(ptid))); 
    return threadId; 
} 
関連する問題