Разделяет ли статический метод свои локальные переменные и что происходит при одновременном использовании из разных потоков? - PullRequest
11 голосов
/ 13 августа 2010

C # Вопрос - я пытаюсь определить, нормально ли использовать статический метод, где внутри метода есть некоторые локальные переменные, которые он использует.Являются ли локальные переменные «общими» при использовании метода?Что происходит, например, если статический метод вызывается / используется одновременно из разных потоков?Один поток блокируется, пока другой не завершится и т. Д.?

Возможно, обобщенный вопрос в многопоточном приложении, когда следует "не" использовать статический метод?

Ответы [ 4 ]

21 голосов
/ 13 августа 2010

Локальные переменные в методе живут в стеке, и каждый поток имеет свой собственный стек. Поэтому для нескольких потоков безопасно использовать метод.

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

4 голосов
/ 13 августа 2010

Являются ли локальные переменные "общими" при использовании метода?

Нет, это не так.Каждый поток, выполняющий метод, имеет свою собственную копию локальных переменных, и они не зависят друг от друга.Когда метод возвращает, конкретная копия локальных для этого конкретного потока отбрасывается.(*)

Что происходит, например, если статический метод вызывается / используется одновременно из разных потоков?Один поток блокируется, пока другой не завершится и т. Д.?

Нет, они не делают;они просто будут выполнять метод в двух отдельных стеках одновременно.Если вы на самом деле хотите их заблокировать, используйте оператор блокировки , который заставляет второй поток, который входит в оператор блокировки, ждать, пока первый не вернется из оператора блокировки.Это может быть необходимо, если ваш метод обращается к (нелокальным) полям, которые являются общими данными.

В многопоточном приложении, когда не должен использовать статический метод?

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

(*) Это может больше не быть правдой, если у вас есть лямбда-выражение или анонимный методвнутри метода, который использует локальные переменные, но это техническая часть.

2 голосов
/ 13 августа 2010

Ни один метод в C # не имеет общих локальных переменных.

Возможно, вы думаете о статических функциях в VB.

1 голос
/ 13 августа 2010

Существует множество причин для использования статических методов в многопоточных приложениях.В этом нет ничего плохого.Пока вы не меняете глобальные переменные (без блокировки), у вас не должно быть проблем.

...