多线程之间的资源共享

Posted github_white

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程之间的资源共享相关的知识,希望对你有一定的参考价值。

转载于:https://blog.csdn.net/u014558484/article/details/52550678

 

同一进程间的线程究竟共享哪些资源呢,而又各自独享哪些资源呢?

共享的资源有
a. 堆  由于堆是在进程空间中开辟出来的,所以它是理所当然地被共享的;因此new出来的都是共享的(16位平台上分全局堆和局部堆,局部堆是独享的)
b. 全局变量 它是与具体某一函数无关的,所以也与特定线程无关;因此也是共享的
c. 静态变量 虽然对于局部变量来说,它在代码中是“放”在某一函数中的,但是其存放位置和全局变量一样,存于堆中开辟的.bss和.data段,是共享的
d. 文件等公用资源  这个是共享的,使用这些公共资源的线程必须同步。Win32 提供了几种同步资源的方式,包括信号、临界区、事件和互斥体。
独享的资源有
a. 栈 栈是独享的
b. 寄存器  这个可能会误解,因为电脑的寄存器是物理的,每个线程去取值难道不一样吗?其实线程里存放的是副本,包括程序计数器PC

线程共享的环境包括:进程代码段、进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)、进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID。

 
   进程拥有这许多共性的同时,还拥有自己的个性。有了这些个性,线程才能实现并发性。这些个性包括:

   1.线程ID
      每个线程都有自己的线程ID,这个ID在本进程中是唯一的。进程用此来标
   识线程。
 
   2.寄存器组的值
      由于线程间是并发运行的,每个线程有自己不同的运行线索,当从一个线
   程切换到另一个线程上 时,必须将原有的线程的寄存器集合的状态保存,以便
   将来该线程在被重新切换到时能得以恢复。
 
   3.线程的堆栈
      堆栈是保证线程独立运行所必须的。
      线程函数可以调用函数,而被调用函数中又是可以层层嵌套的,所以线程
   必须拥有自己的函数堆栈, 使得函数调用可以正常执行,不受其他线程的影
   响。

   4.错误返回码
      由于同一个进程中有很多个线程在同时运行,可能某个线程进行系统调用
   后设置了errno值,而在该 线程还没有处理这个错误,另外一个线程就在此时
   被调度器投入运行,这样错误值就有可能被修改。
      所以,不同的线程应该拥有自己的错误返回码变量。

   5.线程的信号屏蔽码
      由于每个线程所感兴趣的信号不同,所以线程的信号屏蔽码应该由线程自
   己管理。但所有的线程都 共享同样的信号处理器。

   6.线程的优先级
      由于线程需要像进程那样能够被调度,那么就必须要有可供调度使用的参

   数,这个参数就是线程的 优先级。

 

以上是关于多线程之间的资源共享的主要内容,如果未能解决你的问题,请参考以下文章

JAVA多线程之间共享数据BlockingQueue介绍

Java多线程与并发库7.多个线程之间共享数据的方式探讨

webwork学习

多线程之间实现通讯

进程与线程的区别?--多线程与线程池

什么是线程、什么又是多线程 它们之间有什么区别呢?