免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2950 | 回复: 3
打印 上一主题 下一主题

[C] 请教pthread_creat()问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-15 16:07 |只看该作者 |倒序浏览
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <pthread.h>

  4. void *thrd_func(void *arg);
  5. pthread_t tid;

  6. int main(){
  7.     // 创建线程tid,且线程函数由thrd_func指向,是thrd_func的入口点,即马上执行此线程函数
  8.     if (pthread_create(&tid,NULL,thrd_func,NULL)!=0) {
  9.         printf("Create thread error!\n");
  10.         exit(1);
  11.     }

  12.     printf("TID in pthread_create function: %u.\n",tid);
  13.     printf("Main process: PID: %d,TID: %u.\n",getpid(),pthread_self());
  14.    
  15.     sleep(1); //race

  16.     return 0;
  17. }

  18. void *thrd_func(void *arg){
  19. //    printf("I am new thread!\n");
  20.     printf("New process:  PID: %d,TID: %u.\n",getpid(),pthread_self()); //why pthread_self
  21.     printf("New process:  PID: %d,TID: %u.\n",getpid(),tid); //why pthread_self

  22.     pthread_exit(NULL); //退出线程
  23. //    return ((void *)0);
  24. }
复制代码
程序运行结果是:


刚刚接触linux的线程编程,所以有很多不懂的地方,这是某位大牛博客上的一段程序。
1. 我不理解的是,在函数void thrd_func(void *)中,并没有定义tid这个变量,而使用了printf输出,这样不会造成内存引用错误吗?
2. 还有一点不理解的地方是, 为什么在main函数中pthread_self()返回值是3079558848,而在void thrd_func( )函数中thread_sel()返回值是3079555952.
希望大家可以解答一下。

论坛徽章:
0
2 [报告]
发表于 2013-11-15 19:08 |只看该作者
tid是全局变量
main中的self为main线程tid,而函数里的是创建的tid,既然是创建的,tid总不能相同吧

论坛徽章:
0
3 [报告]
发表于 2013-11-15 19:12 |只看该作者
tid 是全局变量啊!---------------------------》回去看语法书
main函数中是主线程,thrd_func中是子线程,返回的当前线程ID当然不一样了!---------------------------》看操作系统相关书籍,理解下线程的概念

从调用pthread_create开始,进程一分为2个线程,主线程继续执行main函数,子线程执行thrd_func函数,两个线程并行运行
pthread_create执行成功后tid里存放的是新建立的子线程的线程ID,自然与thrd_func中调用pthread_self的返回结果一致
而主线程中调用pthread_self却是返回的主线程的id

如果main函数先执行完成,即主线程结束,则子线程自动结束,整个进程结束,回收所有资源
如果thrd_func函数先直接完成,即子线程先一步结束,则线程成为僵尸线程,并未回收其内存,如果需要回收,请随时从主线程中pthread_detach(分离)他,
如果主线程需要等待子线程返回,或者获取其返回值,请在主线程中pthread_join他,调用Join后,子线程自动处于分离状态

相关函数调用以及介绍,请查阅《posxi多线程程序设计》貌似绝版了,去淘宝找找吧!

论坛徽章:
0
4 [报告]
发表于 2013-11-18 10:10 |只看该作者
回复 3# ErenNo1


    多谢详细解答,受益很多。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP