请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于“线程不拥有资源”的问题

老师好,在较进程和线程时说“线程不拥有资源”, 但是不是有个TLS(Thread-local-storage)的概念, 表示每个线程也有独立的内存来存放线程独有的数据。

正在回答

1回答

“线程局部资源”是相对高级的知识,这里为同学的知识面点赞。

1. 要阐释这个问题,先要对TLS的底层实现进行一个简单的了解,首先TLS的存储的空间是属于进程的堆空间,线程与存储空间的联系是通过一个映射去管理的,通过映射可以保证每个线程使用的局部空间都位于线性存储区域的不同部分。

接着回答“线程不拥有资源”的问题。这个主要要看问题的角度。

3. 首先从线程的角度去看,当我们在考虑线程局部变量的时候,我们主要在考虑什么?我们使用线程局部变量的时候,是为了保存线程在运行逻辑过程中的一些中间状态或者数据,并且不希望这些数据被别的线程污染;换个角度去想,我们使用锁以及map映射这样的数据结构,能不能实现线程局部变量的功能?是可以的,我们把线程id作为key,把数据作为value,存放在一个线程安全的map就可以了。

那么为什么不这样实现?因为这样的实现,效率太低,如果线程切换频繁,对性能的损耗就很大,所以线程局部变量才会被提出和使用。而如果按照“线程局部变量就认为线程拥有资源”的逻辑,那么线程运行时,调用函数的堆栈等等都可以考虑为线程的资源,但是为什么不这么强调呢?因为当我们在讨论线程局部变量的时候大多是考虑性能的问题,而不是资源分配的问题。

4. 接着从操作系统的角度去讲,线程所使用的资源来自于进程,线程不能够越过进程去向操作系统申请内存,操作系统对资源的分配也只是细分到进程的层面,因而从这个角度去看,认为是线程是不拥有独立的资源的。

而这里讨论的是操作系统,所以从操作系统的角度去看的话,线程是不拥有资源的。

希望对你有所帮助。

8 回复 有任何疑惑可以回复我~
  • 提问者 Ashburn #1
    清楚明了, 非常感谢!
    回复 有任何疑惑可以回复我~ 2019-07-11 00:06:59
  • 能问下为什么使用线程id作为key,把数据作为value,存放在一个线程安全的map这种形式如果线程切换频繁,对性能的损耗就很大么?
    我的想法是,使用线程id作为key,把数据作为value,存放在一个线程安全的map里,线程切换时就根据线程id去map里拿东西就行了,好像不会有什么要保存线程上下文的损耗,因为这个map保存在了一个共有的空间中
    回复 有任何疑惑可以回复我~ 2021-02-13 14:03:24
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信