关于线程ID的一些理解

在一个主进程(main)中创建了两个线程,如何将两个线程的ID打印出来?

一、创建一个线程,打印它的id值,代码如下:

/*p310 功能:在main函数创建一个新线程,打印TID PID*/
#include
#include

pthread_t ntid; //定义一个线程 id

void PrintIds(char *s)
{
pid_t pid;
pthread_t tid;


pid = getpid();
tid =pthread_self();
printf("%s pid = %lu ,  tid = %lu \n",s,(unsigned long)pid,(unsigned long)tid);
}

void *thread_fun(void *arg)
{
PrintIds("new thread :");
return ((void*)0);
}

int main (void)
{
int iError;

iError = pthread_create(&ntid,NULL,thread_fun,NULL);
if(iError !=0)
{
printf("cannot create thread!\n");
return -1;
}

PrintIds("main thread :");

/*主线程要休眠,否则可能导致新线程来不及运行就退出了*/
sleep(1);
exit(0);
}

这里使用的是pthread_self()这个函数打印tid(线程id),使用getpid()打印pid(进程id),结果如下:

main thread : pid = 21340 ,  tid = 3079182016 


二、创建两个线程,分别打印两个线程id值,代码如下:

#include
#include
#include
#include

pid_t gettid()
{
     return syscall(SYS_gettid);
}

void *thread_fun1(void *arg)
{
printf("thread_fun1 : TID= %lu ,PID = %lu \n", (unsigned long ) gettid(),(unsigned long )getpid()); //打印线程1的id
pthread_exit((void*) 0);
}


void *thread_fun2(void *arg)
{
printf("thread_fun2 : TID= %lu ,PID = %lu \n", (unsigned long ) gettid(),(unsigned long )getpid()); //打印线程2的id
pthread_exit((void*)0);
}


int main (void)
{
int iError;
pthread_t tid1 ,tid2; 

iError = pthread_create(&tid1,NULL,thread_fun1,NULL);
if(iError !=0)
{
printf("cannot create thread1!\n");
return -1;
}

printf("parent starting thread1!\n");
sleep(1);


printf("parent starting thread2!\n");
iError = pthread_create(&tid2,NULL,thread_fun2,NULL);
if(iError !=0)
{
printf("cannot create thread2!\n");
return -1;
}

/*主线程要休眠,否则可能导致新线程来不及运行就退出了*/
sleep(1);
return 0;
}

执行结果如下:

thread_fun1 : TID= 21343 ,PID = 21342 

thread_fun2 : TID= 21344 ,PID = 21342 

注意:

这里使用gettid()函数而不用pthread_self()函数,请注意两者区别。

pthread_self 和gettid 的区别: 

gettid是系统调用(内核),而pthread_self()函数返回调用线程的ID,这个数值与调用 pthread_create 创建本线程时使用的*thread 参数返回的值是一样的。但是这个值和gettid是不同的。并且pthread_self:  这个函数总是成功,返回调用线程的ID。
Thread IDs 仅仅保证在一个进程内部的唯一性。当一个结束了的线程 joined(使用join等待一个线程结束)之后, 或者一个detached 状态的线程被结束 thread ID可能会被重新使用。 因此pthread_self()返回的线程ID与 调用 gettid()得到的内核线程ID可能是不一样的。

你可能感兴趣的:(关于线程ID的一些理解)