2017-06-27 11 views
0
#include<stdio.h> 
#include<unistd.h> 
#include<pthread.h> 
#include<sys/types.h> 
int main(){ 
    int systid=syscall(186); 
    int pt_tid=pthread_self(); 
    pid_t id=getpid(); 
    printf("pid=%d,tid=%d,pt_tid=%d\n",id,systid,pt_tid); 
    return 0; 
} 

このプログラムは、RHEL 5でgcc4.1.2を実行していました。pthread_self()は意味のあるスレッドIDを返しませんか?

$gcc testtid.c -lpthread && ./a.out 
pid=35086,tid=35086,pt_tid=1295541984 

システムコールが正しいスレッドID(同じようなプロセスID)を与えることができるが、pthread_selfが意味のある結果を与えないと思われます。

pthread_selfが移植性がないためですか?

+2

この値は、スレッドを一意に識別します。他の方法で意味をなさないことを意図するものではありません。特に、カーネルで麻痺された識別子と同等である必要はありません。 –

+0

これは、 "linux"コンテキスト値を示すものではなく、POSIXの移植性のためだけです。 –

+0

はい、まさにこれです。 –

答えて

1

あなたがman pthread_selfを読めば、あなたがする必要があります

スレッド識別子が不透明考慮する必要がありますpthreadsの通話中以外のスレッドのIDを使用しようとすると、非ポータブルであると指定されていない結果につながる可能性に。

スレッドIDは、プロセス内でのみ一意であることが保証されています。スレッドIDは、終了したスレッドが結合された後、または分離されたスレッドが終了した後に再利用される可能性があります。

pthread_self()によって返されるスレッドIDは、gettid(2)の呼び出しによって返されたカーネルスレッドIDと同じではありません。

関連する問題