Есть ли у методов объекта cpp свой стек?

У меня есть гипотеза, но это немного сложно проверить.

Существует ли уникальный кадр стека для каждого вызывающего потока, когда два потока вызывают один и тот же метод одного и того же экземпляра объекта? В скомпилированном двоичном файле я понимаю, что класс представляет собой статический раздел кода, заполненный определениями функций в памяти, и единственное различие между различными объектами заключается в this указатель, который передается под капотом.

Но поэтому вызывающий его поток должен иметь свой собственный кадр стека, иначе два потока, пытающиеся получить доступ к одной и той же функции-члену одного и того же экземпляра объекта, повредили бы локальные переменные друг друга.

Просто чтобы повторить здесь, я не имею в виду, могут ли два потока повредить данные объектов, изменяя оба this в то же время я хорошо это знаю. Я больше понимаю, стоит ли двум потокам одновременно вводить один и тот же метод одного и того же экземпляра, независимо от того, находятся ли локальные переменные этого контекста в одной и той же ячейке памяти. Опять же, я предполагаю, что это не так.

1

Решение

Ты прав. Каждый поток использует свой собственный стек, и каждый стек различает локальные переменные между потоками.

Это не относится к C ++, хотя. Это просто способ работы процессоров. (То есть в современных процессорах некоторые старые процессоры имели только один стек, например 6502, который имел только 256 байтов стека и не имел реальной возможности запускать потоки …)

Объекты могут находиться в стеке и совместно использоваться потоками, и в результате вы можете изменить тот же объект в другом стеке потоков. Но это только если вы поделитесь этим конкретным указателем.

1

Другие решения

Вы правы, что разные темы имеют уникальные стеки. Это не особенность c ++ или cpp, а нечто, предоставляемое ОС. Объекты класса не обязательно будут другими. Это зависит от того, как они расположены. Разные потоки могут совместно использовать объекты кучи, что может привести к одновременной проблеме.

0

Локальные переменные любой функции или метода класса хранятся в каждом собственном стеке (фактически помещаются в стек потока, фрейм стека), поэтому не имеет значения, из какого потока вы вызываете метод — он будет использовать свой собственный стек во время выполнения для каждый звонок

немного другое объяснение: каждый вызов метода создает свой собственный стек (или лучший кадр стека)

ПРИМЕЧАНИЕ: статические переменные будут одинаковыми

конечно, существуют методы, чтобы получить доступ к памяти стека другого метода во время выполнения, но есть своего рода хаки

0
По вопросам рекламы [email protected]