Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4604913
  • 博文数量: 385
  • 博客积分: 21208
  • 博客等级: 上将
  • 技术积分: 4393
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-30 13:40
文章分类

全部博文(385)

文章存档

2015年(1)

2014年(3)

2012年(16)

2011年(42)

2010年(1)

2009年(2)

2008年(34)

2007年(188)

2006年(110)

分类: LINUX

2008-11-30 09:08:24

gettid 和pthread_self的区别

The man page for gettid says:


The thread ID returned by this call is not the same thing as a POSIX thread ID
(i.e., the opaque value returned by pthread_self(3)).

看来,线程的id,在linux中分为POSIX thread ID , 和内核中对每一个线程的id.

gettid是linux 的一个系统调用, 查看sys_gettid
/* Thread ID - the internal kernel "pid" */
asmlinkage long sys_gettid(void)
{
    return task_pid_vnr(current);
}


struct upid {
    /* Try to keep pid_chain in the same cacheline as nr for find_pid */
    int nr;
    struct pid_namespace *ns;
    struct hlist_node pid_chain;
};

struct pid
{
    atomic_t count;
    /* lists of tasks that use this pid */
    struct hlist_head tasks[PIDTYPE_MAX];
    struct rcu_head rcu;
    int level;
    struct upid numbers[1];
};


这里面的level不清楚是什么含义? 有知道的告诉我,多谢了。




问:_syscall[0-6]跑哪里去了
答:没有了

问:那现在用啥呢?
答:用系统调用 syscall(2),第一个参数是SYS_name,后面参数照写







 

#define _GNU_SOURCE
#include <stdio.h>
#include <sys/types.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <linux/unistd.h>
#include <sys/syscall.h>

void *thsf(void *arg)
{
    pthread_t th;
    char *retstr;
    retstr=malloc(50);
    memset(retstr,0,50);


    strcpy(retstr,"New thread quit!");


    th=pthread_self();
#if 1
    printf("New thread,pid:%d,tid:%x,another tid:%x.\n",
                      getpid(),
                      th,
                      (long)syscall(SYS_gettid));
#endif
   
    pthread_exit(retstr);
}

int main()
{
        pthread_t nth1,mth,oth;
        void *a;
        if(pthread_create(&nth1,NULL,thsf,NULL))
                printf("Error create new thread.\n");
        mth=pthread_self();

        printf("Main thread,pid:%d,tid:%x,another tid:%x.\n",getpid(),mth,(long)syscall(SYS_gettid));
        if(!pthread_join(nth1,&a))
        {
                printf("New thread quit,message from new thread:%s.\n",(char *)a);
                free((char *)a);
        }
        return 0;
}

阅读(10267) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

pengxihan2010-04-19 16:32:29

大哥,好像没把gettid和pthread_self之间的区别解释清楚啊。 按照愚见,pthread_self返回的是同一个进程中各个线程之间的标识号,对于这个进程内是唯一的,而不同进程中,每个线程返回的pthread_self可能返回的是一样的。 而gettid是用来系统内各个线程间的标识符,由于linux采用轻量级进程实现的,它其实返回的应该是pid号。 你可以在你的程序里的主线程和子线程里加入sleep,然后开两个中断分别运行这个程序可以发现这个结果。

pengxihan2010-04-19 16:32:29

大哥,好像没把gettid和pthread_self之间的区别解释清楚啊。 按照愚见,pthread_self返回的是同一个进程中各个线程之间的标识号,对于这个进程内是唯一的,而不同进程中,每个线程返回的pthread_self可能返回的是一样的。 而gettid是用来系统内各个线程间的标识符,由于linux采用轻量级进程实现的,它其实返回的应该是pid号。 你可以在你的程序里的主线程和子线程里加入sleep,然后开两个中断分别运行这个程序可以发现这个结果。