Hi, I did a quick look at the code of the NPTL. I found that the pthread_self does not return the tid but the address of the struct pthread which is allocated in the stack (at least on i386 and possibly on other Arch too). Struct pthread contains various information used by the pthreaded calls. It created in the stack during pthread creation. pthread_self just finds the structure from stack and return its address.
Yes! It is right. I "strace"d the _pid_ file compiled from pid.c, I get the result as follows(just a snapshot). clone(child_stack=0xb7f7d4d4, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND| CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS| CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0xb7f7dbe8, {entry_number:6, base_addr:0xb7f7dba0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}, child_tidptr=0xb7f7dbe8) = 21945 clone(child_stack=0xb757c4d4, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND| CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS| CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0xb757cbe8, {entry_number:6, base_addr:0xb757cba0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}, child_tidptr=0xb757cbe8) = 21946 futex(0xb7f7dbe8, FUTEX_WAIT, 21945, NULL In the thread 0:posix tid 3086474144 In the thread 0:pid 21944 In the thread 0:tid 21945) = 0 futex(0xb757cbe8, FUTEX_WAIT, 21946, NULL In the thread 1:posix tid 3075984288 In the thread 1:pid 21944 In the thread 1:tid 21946) = 0 As we see, base_addr:0xb7f7dba0 in the first clone()== 3086474144 in thread 0 while base_addr:0xb757cba0 in the second clone()== 3075984288 in thread 1 Best Regards, Cheng -- Kernelnewbies: Help each other learn about the Linux kernel. Archive: http://mail.nl.linux.org/kernelnewbies/ FAQ: http://kernelnewbies.org/faq/