1

我在这里有一个假设,但验证起来有点困难。

当两个线程调用同一对象实例的相同方法时,每个调用线程是否有唯一的堆栈帧?在已编译的二进制文件中,我将类理解为在内存中填充函数定义的静态代码部分,不同对象之间的唯一区别是this在引擎盖下传递的指针。

但是因此调用它的线程必须有自己的堆栈帧,否则两个线程试图访问同一个对象实例的同一个成员函数,将破坏彼此的局部变量。

在这里重申一下,我不是指两个线程是否可以通过同时修改来破坏对象数据this,我很清楚这一点。我更了解在两个线程同时进入同一个实例的同一个方法的情况下,该上下文的局部变量是否在内存中的相同位置。同样,我的假设是它们不是。

4

3 回答 3

1

你是对的。每个线程都使用自己的堆栈,并且每个堆栈都使线程之间的局部变量不同。

这不是特定于 C++ 的。这只是处理器运行的方式。(即在现代处理器中,一些较旧的处理器只有一个堆栈,例如 6502,只有 256 字节的堆栈,没有真正的运行线程能力......)

对象可能在堆栈上并在线程之间共享,因此您最终可以在另一个线程堆栈上修改相同的对象。但这只有在您共享该特定指针的情况下。

于 2013-10-15T04:48:19.427 回答
0

你是对的,不同的线程有独特的堆栈。这不是 c++ 或 cpp 的特性,而是操作系统提供的特性。类对象不必不同。这取决于它们的分配方式。不同的线程可以共享堆对象,这可能会导致并发问题。

于 2013-10-15T04:43:42.243 回答
0

任何函数或类方法的局部变量都存储在每个自己的堆栈中(实际上放置在线程的堆栈,堆栈框架中),因此从哪个线程调用方法无关紧要 - 它会在执行期间使用它自己的堆栈每次通话

有点不同的解释:每个方法调用都会创建自己的堆栈(或更好的堆栈框架)

注意:静态变量将是相同的

当然存在在执行期间访问另一个方法的堆栈内存的技术,但是有一些技巧

于 2013-10-15T04:44:09.867 回答