共享的资源有
a. 堆
由于堆是在进程空间中开辟出来的,所以它是理所当然地被共享的;因此new出来的都是共享的(16位平台上分全局堆和局部堆,局部堆是独享的)
b. 全局变量
它是与具体某一函数无关的,所以也与特定线程无关;因此也是共享的
c. 静态变量
虽然对于局部变量来说,它在代码中是“放”在某一函数中的,但是其存放位置和全局变量一样,存于堆中开辟的.bss和.data段,是共享的
d. 文件等公用资源
进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID,是共享的。
独享的资源有
a. 栈
栈是独享的。栈是保证线程独立运行所必须的。线程函数可以调用函数,而被调用函数中又是可以层层嵌套的,所以线程必须拥有自己的函数堆栈,使得函数调用可以正常执行,不受其他线程的影响。
b. 寄存器 这个可能会误解,因为电脑的寄存器是物理的,每个线程去取值难道不一样吗?其实线程里存放的是副本,包括程序计数器PC
一个进程创建的多个线程:每个线程都拥有自己私有的Stack,但共享一个Heap这样做的原因:
1、Stack常常用来存放 函数的参数,函数中使用的自动变量,存放过程活动记录;如果多个线程共享一个Stack会非常的凌乱,不方便使用
2、使用共享Heap的目的是为了高效的数据共享
线程间的数据交换有两种方式:
(1)共享内存方式sharedmemory(共享堆):最大的优势是快速
(2)消息传递方式messagepassing(不需要共享堆):优势在于安全