每个线程都有自己的堆栈吗?

Posted

技术标签:

【中文标题】每个线程都有自己的堆栈吗?【英文标题】:Does each thread have its own stack? 【发布时间】:2013-08-23 09:35:25 【问题描述】:

当我从一个进程创建多个线程时,每个线程都有自己的堆栈,还是它们共享父进程的堆栈。当线程进行系统调用时会发生什么?线程是否也像进程一样维护自己的内核堆栈?

【问题讨论】:

是线程特定堆栈!,全局值可在线程之间共享(本地非) @GrijeshChauhan 当我们从线程进行系统调用时会发生什么? 例如如果你调用open()系统调用来打开一个文件。使用int f = open() 然后当然f 是线程本地的。但请记住文件描述符在线程之间共享。如果您知道f 的值,那么您可以在不同的线程中使用该值来访问同一个文件(您不需要再次打开) Each thread has a reserved region of memory referred to as its stack. @LidongGuo No. 线程语义是两个委员会合作的一件事。 (接口有所不同,因为 C 显然不能为线程、互斥锁等提供“对象”,但语义是相同的。) 【参考方案1】:

是的,线程有自己的堆栈和自己的内核堆栈(例如 linux)。

当一个线程进行系统调用时,你陷入内核模式(从用户模式),你将参数传递给内核,检查参数,内核做它需要做的事情(在内核堆栈中),将最终值返回给线程并返回用户模式。

【讨论】:

内核如何在没有堆栈的情况下完成“需要做的事情”? 我会在我的回答中澄清 内核堆栈只是添加到预先存在的模型上的安全预防措施。多栈是多线程的先决条件。内核本质上提供了用户空间中发生的任何事情的并行版本,以防止敏感数据泄露。 @Potatoswatter 内核线程如何提高安全性?据我了解,它是为提高性能而设计的。

以上是关于每个线程都有自己的堆栈吗?的主要内容,如果未能解决你的问题,请参考以下文章

015 线程创建

在多线程 Java 程序中,每个线程是不是都有自己的 System.out 副本?

转---队列堆栈堆栈的区别

linux 线程间共享内核栈吗

谁创建和拥有调用堆栈以及调用堆栈如何在多线程中工作?

Win32线程安全问题.同步函数