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 总结
实际上工作时,我们只需要记住这句话即可:线程间栈独立,堆共享。