当前位置: 技术问答>linux和unix
linux下线程所属进程号问题
来源: 互联网 发布时间:2016-04-14
本文导语: 这一段看《unix环境高级编程》,一个关于线程的小例子。 #include #include #include pthread_t ntid; void printids(const char *s){ pid_t pid; pthread_t tid; pid=getpid(); tid=pthread_self(); printf("%s pid %u tid %u (0x%x)n",s,(unsigned int)p...
这一段看《unix环境高级编程》,一个关于线程的小例子。
#include
#include
#include
pthread_t ntid;
void printids(const char *s){
pid_t pid;
pthread_t tid;
pid=getpid();
tid=pthread_self();
printf("%s pid %u tid %u (0x%x)n",s,(unsigned int)pid,
(unsigned int)tid,(unsigned int)tid);
}
void *thr_fn(void *arg){
printids("new thread:");
return ((void *)0);
}
int main(){
int err;
err=pthread_create(&ntid,NULL,thr_fn,NULL);
if(err!=0)
fprintf(stderr,"can't create threadn");
printids("main thread");
sleep(1);
exit(0);
}
根据线程模型,在同一进程环境下的线程有不同的线程ID,但所在进程ID相同。书上说linux是使用clone系统调用来实现pthread_create的,执行这段程序得到的主线程和新线程所在的进程号并不是匹配的。可我在机器上试了一下,进程号是相同的。这是其中一次运行结果:
new thread: pid 2568 tid 3076471728 (0xb75f3bb0)
main thread pid 2568 tid 3076476448 (0xb75f4e20)
系统是用的是redhat enterprise AS 3 update 5,内核V 2.4.21-32.ELsmp
莫非实现变了?。。。
#include
#include
#include
pthread_t ntid;
void printids(const char *s){
pid_t pid;
pthread_t tid;
pid=getpid();
tid=pthread_self();
printf("%s pid %u tid %u (0x%x)n",s,(unsigned int)pid,
(unsigned int)tid,(unsigned int)tid);
}
void *thr_fn(void *arg){
printids("new thread:");
return ((void *)0);
}
int main(){
int err;
err=pthread_create(&ntid,NULL,thr_fn,NULL);
if(err!=0)
fprintf(stderr,"can't create threadn");
printids("main thread");
sleep(1);
exit(0);
}
根据线程模型,在同一进程环境下的线程有不同的线程ID,但所在进程ID相同。书上说linux是使用clone系统调用来实现pthread_create的,执行这段程序得到的主线程和新线程所在的进程号并不是匹配的。可我在机器上试了一下,进程号是相同的。这是其中一次运行结果:
new thread: pid 2568 tid 3076471728 (0xb75f3bb0)
main thread pid 2568 tid 3076476448 (0xb75f4e20)
系统是用的是redhat enterprise AS 3 update 5,内核V 2.4.21-32.ELsmp
莫非实现变了?。。。
|
getconf GNU_LIBPTHREAD_VERSION
用上面的命令,看一下输出,就知道你使用的线程库是LinuxThread还是NPTL,后者同一进程的不同线路程的进程号一致。前者不一致
用上面的命令,看一下输出,就知道你使用的线程库是LinuxThread还是NPTL,后者同一进程的不同线路程的进程号一致。前者不一致