在一个主进程(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可能是不一样的。