Подтвердить что ты не робот

Механизм блокировки необходим для статических функций?

Я создал файл CommonUtils.cs, содержащий 5 статических функций (так что я могу просто "скопировать" этот .cs для других проектов в Visual Studio, так как я разрабатываю разные приложения С#), вместе с тем у меня есть много исходных файлов.

Теперь я скомпилировал свой проект в DLL. Эта DLL размещается на сервере IIS в качестве приложения. Многие клиенты используют эту DLL для выполнения чего-то, говорят, что они создают отчет.

Мне сообщили, что "статические функции" не должны использоваться щедро в этом контексте, и они должны применяться, механизм "блокировки", поскольку без блокировки, нескольких потоков одного экземпляра программы или нескольких экземпляров программы, оба могут вести себя неожиданно. Это правда?

4b9b3361

Ответ 1

Мне сообщили, что "статические функции" не должны использоваться щедро в этом контексте, и они должны применяться, "блокировка", механизм, поскольку без блокировки, несколько потоков одного экземпляра программы или нескольких экземпляров программы, оба могут вести себя неожиданно. Это правда?

Позвольте разбить его по частям. Что такое статический класс?

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

Как CLR обрабатывает статический класс?

Как и в случае со всеми типами типов, информация типа для статического класс загружается средним языковым стандартом .NET Framework (CLR) когда загружается программа, которая ссылается на класс. Программа не может точно указать, когда загружен класс. Однако это гарантированно будет загружен и для инициализации его полей и его статический конструктор, вызываемый до того, как класс ссылается на первый времени в вашей программе. Статический конструктор называется только один раз, и статический класс остается в памяти для времени жизни домен приложения, в котором находится ваша программа.

Теперь зачем нам может блокироваться?

В принципе, блокировка необходима, когда у нас есть условия гонки. Когда кто-то может читать данные, которые кто-то другой может изменить их в одно и то же время. Два отдельных потока имеют доступ к общему ресурсу, и для предотвращения этого не существует какого-либо механизма. Чтобы ответить на ваш вопрос, вы должны сначала ответить на другой вопрос.

Поддерживает ли ваши статические методы доступ к общим ресурсам, и может быть какое-либо условие гонки? Если это правда, вам нужно использовать блокировку. В противном случае это не требуется.

Для получения дополнительной информации о статических классах, пожалуйста, посмотрите здесь. Если вам нужна дополнительная информация о методах синхронизации потоков, посмотрите здесь.

Ответ 2

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

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

Ответ 3

Похоже, у вас есть библиотека классов. Вот рекомендации Microsoft для библиотек классов, которые должны поддерживать многопоточность:

  • Избегайте необходимости синхронизации, если это возможно. Это особенно верно для сильно используемого кода. Например, алгоритм может быть скорректирован таким образом, чтобы переносить состояние гонки, а не устранять его. Ненужная синхронизация снижает производительность и создает возможность взаимоблокировок и условий гонки.

  • По умолчанию статические данные (Shared in Visual Basic) безопасны по потоку.

  • Не делайте потоки данных экземпляра по умолчанию. Добавление блокировок для создания потокобезопасного кода снижает производительность, увеличивает конфликт блокировок и создает возможность возникновения взаимоблокировок. В обычных моделях приложений только один поток за раз выполняет код пользователя, что сводит к минимуму необходимость обеспечения безопасности потоков. По этой причине библиотеки классов .NET Framework по умолчанию не являются потокобезопасными.

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

Скопировано из https://msdn.microsoft.com/en-us/library/1c9txz50(v=vs.110).aspx

Ответ 4

Объяснение для "LOCK" От MSDN говорит:
Ключевое слово lock указывает блок оператора как критический раздел, получая блокировку взаимного исключения для данного объекта, выполняя инструкцию, а затем освобождая блокировку.

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

Ссылки:
https://msdn.microsoft.com/en-us/library/c5kehkcz.aspx

Лучше использовать LOCK в многопоточности, чем создавать статические функции каждый раз.