ООП вопрос о функциях, которые внезапно поразили меня - PullRequest
0 голосов
/ 24 марта 2010

Может быть, мой вопрос глупый. Но я бы хотел, чтобы это очистили. Мы знаем, что функции загружаются в память только один раз, и когда вы создаете новые объекты, создаются только переменные экземпляра, функции никогда не создаются. Мой вопрос, скажем, предположим, что есть сервер и все клиенты обращаются к методу createCustomer (). Предположим, что все клиенты делают что-то, что запускает createCustomer на сервере. Итак, если метод находится в середине выполнения, и новый клиент запускает его. Будет ли новый запрос отложен? или новый запрос также начнет выполнять метод? Как все это управляется, когда в памяти есть только одна копия функции? Ни одна книга не упоминает ответы на этот тип вопросов. Так что я пишу здесь, где я обязан получить ответы:).

Ответы [ 3 ]

4 голосов
/ 24 марта 2010

Функции - это код, который затем выполняется в контексте памяти. Код может выполняться много раз параллельно ( буквально параллельно на многопроцессорной машине), но каждый из этих вызовов будет выполняться в различном контексте памяти (с точки зрения локальных переменных и т. Д.). ). На низком уровне это работает, потому что функции будут ссылаться на локальные переменные как смещения в памяти для чего-то, называемого « stack », на которое указывает регистр процессора, называемый «указатель стека» (или в некоторых интерпретируемых языках). аналог этого регистра на более высоком уровне), и значение этого регистра будет различным для разных вызовов функции. Таким образом, локальная переменная x в одном вызове функции foo находится в другом месте в памяти, чем локальная переменная x в другом вызове foo, независимо от того, происходят ли эти вызовы одновременно.

Переменные экземпляра разные, на них ссылаются через ссылку (указатель) на память, выделенную для экземпляра объекта. Две работающие копии одной и той же функции могут обращаться к одной и той же переменной экземпляра в точно в одно и то же время; аналогично, две разные функции могут сделать это. Вот почему мы сталкиваемся с проблемами "потоков" или параллелизма , синхронизацией, блокировками , условиями гонки и т. Д. Но это также одна из причин того, что вещи могут быть очень эффективными .

1 голос
/ 24 марта 2010

Это называется "многопоточность". Если каждый запрос имеет свой собственный поток, и объект содержит изменяемые данные, каждый клиент будет иметь возможность изменять состояние объекта по своему усмотрению. Если человек, который написал объект, не заботится о безопасности потоков, вы можете получить объект, который находится в несовместимом состоянии между запросами.

1 голос
/ 24 марта 2010

Это основная проблема с потоками, вы можете посмотреть ее на http://en.wikipedia.org/wiki/Thread_(computer_science).

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

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

Существуют способы синхронизации вызовов, поэтому дополнительные абоненты должны ждать до завершения первого вызова. Это также объясняется в приведенной выше ссылке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...