Почему функции потокобезопасны на уровне машинного кода, если они не используют глобальные данные? - PullRequest
1 голос
/ 25 марта 2020

Я думал об этом уже несколько дней: когда я компилирую функцию в машинный код, это просто отдельная часть всей базы кода. Когда я вызываю функцию, параметры копируются, и указатель инструкции процесса переходит в начало функции. Это правильно?

Если так, я не понимаю, как функции могут быть поточно-ориентированными, если они не используют глобальные данные. Допустим, два потока одновременно вызывают одну и ту же функцию с разными данными. Таким образом, они оба работают с одними и теми же данными инструкций в оперативной памяти. Как это гарантируется, что они не смешиваются? Это то, для чего предназначен переключатель контекста?

Я думаю, что у меня есть некоторое недопонимание о том, как функции работают на уровне машинного кода. Помощь приветствуется.

Ответы [ 2 ]

2 голосов
/ 25 марта 2020

Не полный ответ, но ...

Если вы хотите узнать об этом всю компьютерную науку, укажите место, где хранятся аргументы и локальные переменные активного вызова функции. запись активации . «Стек», о котором мы так часто говорим в большинстве современных языков программирования, на самом деле представляет собой стек из записей активации.

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

1 голос
/ 25 марта 2020

Каждый поток имеет свой собственный стек.

Параметры и локальные переменные помещаются в этот стек.

Обычно единственной частью метода, который разделяют потоки, является машинный код только для чтения.

...