#include <stdio.h> #include <pthread.h> #include <sys/types.h> #include <sys/syscall.h> struct message { int i; int j; }; void *hello(struct message *str) { printf("child, the tid=%lu, pid=%d ",pthread_self(),syscall(SYS_gettid)); printf("the arg.i is %d, arg.j is %d ",str->i,str->j); printf("child, getpid()=%d ",getpid()); while(1); } int main(int argc, char *argv[]) { struct message test; pthread_t thread_id; test.i=10; test.j=20; pthread_create(&thread_id,NULL,hello,&test); printf("parent, the tid=%lu, pid=%d ",pthread_self(),syscall(SYS_gettid)); printf("parent, getpid()=%d ",getpid()); pthread_join(thread_id,NULL); return 0; }
getpid()得到的是进程的pid,在内核中,每个线程都有自己的PID,要得到线程的PID,必须用syscall(SYS_gettid);
pthread_self函数获取的是线程ID,线程ID在某进程中是唯一的,在不同的进程中创建的线程可能出现ID值相同的情况。
#include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <unistd.h> #include <sys/syscall.h> void *thread_one() { printf("thread_one:int %d main process, the tid=%lu,pid=%ld ",getpid(),pthread_self(),syscall(SYS_gettid)); } void *thread_two() { printf("thread two:int %d main process, the tid=%lu,pid=%ld ",getpid(),pthread_self(),syscall(SYS_gettid)); } int main(int argc, char *argv[]) { pid_t pid; pthread_t tid_one,tid_two; if((pid=fork())==-1) { perror("fork"); exit(EXIT_FAILURE); } else if(pid==0) { pthread_create(&tid_one,NULL,(void *)thread_one,NULL); pthread_join(tid_one,NULL); } else { pthread_create(&tid_two,NULL,(void *)thread_two,NULL); pthread_join(tid_two,NULL); } wait(NULL); return 0; }