在阅读线程共享所有内容的答案时,我偶然发现了术语"调用堆栈"。虽然我知道线程有自己的堆栈,但是他们不与其他线程共享,我不明白调用堆栈对于一个线程意味着什么。 我看到了一些答案,但不是很清楚。 请详细说明调用堆栈的含义以及它在多任务处理中与堆栈的区别。 此致
答案 0 :(得分:2)
请说明调用堆栈的含义以及它与堆栈的不同之处 在多任务处理的背景下。
区别是微妙的,但这是我理解它的方式。通常人们可以互换使用这些,但调用堆栈只是一个数据结构。它描述了一堆函数调用以及各种相关状态,如局部变量,返回状态等的值
堆栈也是一种数据结构,但它最终是内存分配器。它为一个线程分配的内存用于调用堆栈之类的事情,它具有非常简单,恒定时间,对称push
和pop
样式的分配和释放内存。
粗略地说,您可能会将其视为std::vector
和std::allocator
之间的关系。 std::vector
严格来说是一种数据结构。 std::allocator
为它分配内存(通常涉及引擎盖后面的数据结构,但仅用于内存管理的数据结构)。但std::vector
并不一定要使用std::allocator
。
从概念上讲,调用堆栈实际上不必使用堆栈来分配内存。在实践中,很难找到一个能够做到这一点的编译器。例如,调用堆栈实际上可以使用堆而不是堆栈。每次它只想推送函数调用的参数时,实际上可能需要线性时间内存分配。这可能很糟糕,但它与调用堆栈的概念并不矛盾。
通常调用堆栈使用线程局部堆栈来分配内存,因为它实用,高效,符合预期的分配/释放的LIFO性质,并允许每个线程拥有自己的内存空间(缓解与共享内存访问相关的瓶颈)
答案 1 :(得分:1)
调用堆栈是一种堆栈数据结构,用于存储有关计算机程序的活动子例程的信息。
线程堆栈是什么是线程的私有堆栈,你知道它。
如果线程正在执行函数,那么当前函数call stack
将存储到thread stack
。
这两件事基本相同。它们都是堆栈数据结构。
答案 2 :(得分:0)
阅读有关call stack和multithreading。
的wikipages在纯理论中,C实现甚至可能不使用任何堆栈。在实践中,我听说的每个编译的 C实现都使用一个调用堆栈,它是一个处理器堆栈(一些处理器,可能是Itanium IA-64,有一个有两个机器堆栈)当有一个(AFAIK,IBM z Series大型机没有任何硬件堆栈,它是一些寄存器的常规用法)。因此,对于大多数处理器和ABI s(ARM,x86,x86-64,...)调用堆栈是堆栈,每个线程都有自己的。