03LinuxC线程学习之线程共享和非共享

1 线程共享和非共享

1.1 线程共享资源

  • 1)文件描述符表。由于线程间共享进程间的内容,而文件描述符表在主线程的PCB当中,各个线程可以直接去请求访问,所以线程间通信就不需要像进程那样通过管道这些方式通信。
  • 2)每种信号的处理方式。即当某个信号发送到该进程时,该进程有多个线程,那么哪个线程捕捉到就谁处理。但mask是不共享的,所以可以通过这个指定某个线程接收。但不建议信号与线程混用,难度很大。
  • 3)当前工作目录。物理内存地址相同,所以工作目录相同。因为工作目录的物理地址是唯一的。只有物理内存地址相同才能保证工作目录相同。
  • 4)用户ID和组ID。很简单,因为都在0-3G的用户空间。
  • 5)内存地址空间 (.text/.data(全局区)/.bss(静态区)/heap/共享库)。(线程间栈独立,堆共享)

1.2 线程非共享资源

  • 1)线程id。
  • 2)处理器现场和栈指针(内核栈)。(上面说了,线程间栈独立,堆共享)
  • 3)独立的栈空间(用户空间栈)。
  • 4)errno变量。注:errno是全局变量,本来应该是共享的,但是就这么巧,它是唯一一个全局变量不共享的。
  • 5)信号屏蔽字。不共享因为需要它去拦截对应信号,实现某个信号给指定线程处理。
  • 6)调度优先级。

2 线程优、缺点

  • 1)优点: 1. 提高程序并发性;2. 开销小;3. 数据通信、共享数据方便。
  • 2)缺点: 1. 库函数,不稳定;2. 调试、编写困难、gdb不支持;3. 对信号支持不好。
  • 3)优点相对突出,缺点均不是硬伤。Linux下由于实现方法导致进程、线程差别不是很大。

3 总结

实际上工作时,我们只需要记住这句话即可:线程间栈独立,堆共享。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值