有一段代码
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <pthread.h> 5 #include <unistd.h> 6 pthread_t ntid; 7 void printids(const char *s) 8 { 9 pid_t pid; 10 pthread_t tid; 11 pid = getpid(); 12 tid = pthread_self(); 13 printf("%s pid %u tid %u (0x%x)\n", s, (unsigned int)pid, 14 (unsigned int)tid, (unsigned int)tid); 15 } 16 void *thr_fn(void *arg) 17 { 18 printids(arg); 19 return NULL; 20 } 21 int main(void) 22 { 23 int err; 24 err = pthread_create(&ntid, NULL, thr_fn, "new thread: "); 25 if (err != 0) { 26 fprintf(stderr, "can‘t create thread: %s\n", 27 strerror(err)); 28 exit(1); 29 } 30 printids("main thread:"); 31 sleep(1); 32 return 0; 33 }
这段代码main函数中创建了一个线程,如果创建失败则输出出错信息。
printids函数打印当前进程id和线程id
main函数的线程和新创建的线程都会调用printids,得到线程信息。
编译运行结果如下:
$ gcc main.c -lpthread
$ ./a.out
main thread: pid 7398 tid 3084450496 (0xb7d8fac0)
new thread: pid 7398 tid 3084446608 (0xb7d8eb90)
那么问题来了:
主线程在一个全局变量 ntid 中保存了新创建的线程的id,如果新创建的线程不调用
pthread_self 而是直接打印这个 ntid ,能不能达到同样的效果?
正常情况下,如果直接使用全局变量的ntid是可以得到新线程的thread_id的,但是如果代码修改一下
void printids(const char *s) { pid_t pid; pthread_t tid; printf("globel: ntid(%u) ntid(0x%x) \n",(unsigned int)ntid, (unsigned int)ntid); pid = getpid(); tid = pthread_self(); printf("%s pid %u tid %u (0x%x)\n", s, (unsigned int)pid, (unsigned int)tid, (unsigned int)tid); }
main函数中开启多个线程
1 for(i=0;i<10;i++) 2 { 3 err = pthread_create(&ntid, NULL, thr_fn, "new thread: "); 4 if (err != 0) { 5 fprintf(stderr, "can‘t create thread: %s\n", 6 strerror(err)); 7 exit(1); 8 }
那么输出结果将会是非常凌乱的。
globel: ntid(2801985280) ntid(0xa702e700) new thread: pid 3545 tid 2810377984 (0xa782f700) globel: ntid(2793592576) ntid(0xa682d700) new thread: pid 3545 tid 2793592576 (0xa682d700) globel: ntid(2751629056) ntid(0xa4028700) new thread: pid 3545 tid 2760021760 (0xa4829700) globel: ntid(2793592576) ntid(0xa682d700) globel: ntid(2734843648) ntid(0xa3026700) globel: ntid(2768414464) ntid(0xa502a700) new thread: pid 3545 tid 2734843648 (0xa3026700) globel: ntid(2768414464) ntid(0xa502a700) new thread: pid 3545 tid 2801985280 (0xa702e700) globel: ntid(2734843648) ntid(0xa3026700) new thread: pid 3545 tid 2743236352 (0xa3827700) new thread: pid 3545 tid 2776807168 (0xa582b700) new thread: pid 3545 tid 2785199872 (0xa602c700) globel: ntid(2768414464) ntid(0xa502a700) new thread: pid 3545 tid 2768414464 (0xa502a700) globel: ntid(2743236352) ntid(0xa3827700) new thread: pid 3545 tid 2751629056 (0xa4028700) globel: ntid(2734843648) ntid(0xa3026700) main thread: pid 3545 tid 2818803520 (0xa8038740)
有时会连续输出好几个globel变量,之后才输出一个或者多new thread信息。可见在多线程中,这种方法不总是实用的。
原文:http://www.cnblogs.com/whiteHome/p/4871074.html