Linux线程pthread笔记

在阅读Nginx的代码.先碰到的是线程部分的
因为从main开始最早是做线程部分的工作
实习一下pthread方面的内容

  1. #include "pthread.h"
  2. #include "stdio.h"
  3. void* thread_test(void* ptr)
  4. {
  5.         while(1)
  6.         printf("i am child pthread/n");
  7. }
  8. int main()
  9. {
  10.         pthread_t tid;
  11.         pthread_create(&tid, NULL, thread_test, NULL);
  12.         while(1)
  13.         printf("i am main pthread/n");
  14.         return 0;
  15. }

这段代码是从别人这里找到的.不过把当中的bug修正了
编译命令行

  1. ./gcc -lpthread -o pthread ./pthread.c

记住需要加-lpthread参数,否则pthread的相关函数会报告说找不到
关于pthread_create函数
有人提到他创建的子线程获取到的pid和主线程的不一致
这是由于早期内核版本中的实现不同.由于pthread只是使用轻量进程去模拟线程
早期的pthread实现是linuxthread库,每个轻量进程会被显示在ps进程列表中
而最新的pthread实现是NPTL,所有轻量进程在进程列表中只表现为主线程的PID号.
其实每个线程的pid是不同的.但是pthread库让通过pthread_create创建的线程的pid与主pid一致而已.
既然每个进程都有独立的进程,那么实际的线程的进程号在哪里可以看到呢?
经过试验
我发现在/proc/[PID]/task目录下
保存有此进程所有的pthread的实际进程号
例如上面的例程,当我们执行之后
我们在ps中看到的进程号如果是20632
那么进入/proc/20632/task
我们可以看到有20632以及20633两个pid
其实20633就是第二个创建出来的轻量进程
根据POSIX的要求
我们杀掉任何一个线程,其实都会把SIGNO发送到所有的线程中.
所以我们如果执行kill -9 20633
其实你会发现整个程序都退出了
下面我把POSIX对线程实现的要求贴出来(这部分参考了linux线程浅析)
1, 查看进程列表的时候, 相关的一组task_struct应当被展现为列表中的一个节点;
2, 发送给这个”进程”的信号(对应kill系统调用), 将被对应的这一组task_struct所共享, 并且被其中的任意一个”线程”处理;
3, 发送给某个”线程”的信号(对应pthread_kill), 将只被对应的一个task_struct接收, 并且由它自己来处理;
4, 当”进程”被停止或继续时(对应SIGSTOP/SIGCONT信号), 对应的这一组task_struct状态将改变;
5, 当”进程”收到一个致命信号(比如由于段错误收到SIGSEGV信号), 对应的这一组task_struct将全部退出;
6, 等等(以上可能不够全);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值