У меня есть гипотеза, но это немного сложно проверить.
Существует ли уникальный кадр стека для каждого вызывающего потока, когда два потока вызывают один и тот же метод одного и того же экземпляра объекта? В скомпилированном двоичном файле я понимаю, что класс представляет собой статический раздел кода, заполненный определениями функций в памяти, и единственное различие между различными объектами заключается в this
указатель, который передается под капотом.
Но поэтому вызывающий его поток должен иметь свой собственный кадр стека, иначе два потока, пытающиеся получить доступ к одной и той же функции-члену одного и того же экземпляра объекта, повредили бы локальные переменные друг друга.
Просто чтобы повторить здесь, я не имею в виду, могут ли два потока повредить данные объектов, изменяя оба this
в то же время я хорошо это знаю. Я больше понимаю, стоит ли двум потокам одновременно вводить один и тот же метод одного и того же экземпляра, независимо от того, находятся ли локальные переменные этого контекста в одной и той же ячейке памяти. Опять же, я предполагаю, что это не так.
Ты прав. Каждый поток использует свой собственный стек, и каждый стек различает локальные переменные между потоками.
Это не относится к C ++, хотя. Это просто способ работы процессоров. (То есть в современных процессорах некоторые старые процессоры имели только один стек, например 6502, который имел только 256 байтов стека и не имел реальной возможности запускать потоки …)
Объекты могут находиться в стеке и совместно использоваться потоками, и в результате вы можете изменить тот же объект в другом стеке потоков. Но это только если вы поделитесь этим конкретным указателем.
Вы правы, что разные темы имеют уникальные стеки. Это не особенность c ++ или cpp, а нечто, предоставляемое ОС. Объекты класса не обязательно будут другими. Это зависит от того, как они расположены. Разные потоки могут совместно использовать объекты кучи, что может привести к одновременной проблеме.
Локальные переменные любой функции или метода класса хранятся в каждом собственном стеке (фактически помещаются в стек потока, фрейм стека), поэтому не имеет значения, из какого потока вы вызываете метод — он будет использовать свой собственный стек во время выполнения для каждый звонок
немного другое объяснение: каждый вызов метода создает свой собственный стек (или лучший кадр стека)
ПРИМЕЧАНИЕ: статические переменные будут одинаковыми
конечно, существуют методы, чтобы получить доступ к памяти стека другого метода во время выполнения, но есть своего рода хаки