ключевое слово блокировки в C#

Другие ответы не охватывали случай, когда вы хотите, чтобы разветвленные процессы делили ваш новый stdout.

Для этого:

from os import open, close, dup, O_WRONLY

old = dup(1)
close(1)
open("file", O_WRONLY) # should open on 1

..... do stuff and then restore

close(1)
dup(old) # should dup to 1
close(old) # get rid of left overs
43
задан Chris 27 September 2008 в 06:59
поделиться

10 ответов

, Когда блокировка должна использоваться?

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

, Но действительно ли необходимо, когда приложение не отделяет никакие другие потоки?

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

там проблемы производительности с использованием блокировки?

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

..., если это - хороший шаблон разработки для следования в будущем [?]

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

58
ответ дан Eric 23 September 2019 в 12:46
поделиться

Примите во внимание, что могли бы быть причины, почему Ваше приложение не является столь однопоточным, как Вы думаете. Асинхронный ввод-вывод в.NET может хорошо обратный вызов на потоке пула, например, также, как и некоторые различные классы таймера (не Таймер Windows Forms, хотя).

6
ответ дан Will Dean 23 September 2019 в 12:46
поделиться

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

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

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

Поэтому даже при том, что Ваше приложение является однопоточным, это может быть опасностью для Вас. Полагайте, что один метод в заблокированном блоке выдает исключение, которое в конечном счете не обработано в блоке. Даже если с исключением имеют дело, поскольку оно пузырится через стек вызовов, Ваш критический регион кода обычно не заканчивался. И кто знает, как CLR будет реагировать?

Для большего количества информации, читайте эта статья об опасностях Потока. Аварийное прекращение работы () .

7
ответ дан André Chalella 23 September 2019 в 12:46
поделиться

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

До удаления блокировок. Это будет зависеть от того, что точно делает код. Даже при том, что это является единственным, распараллелил, если Ваш объект реализован как Singleton, возможно, что у Вас будет несколько клиентов, использующих экземпляр его (в памяти на сервере) одновременно..

1
ответ дан Peter Bernier 23 September 2019 в 12:46
поделиться

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

2
ответ дан John Christensen 23 September 2019 в 12:46
поделиться

Да, будет некоторая потеря производительности при использовании блокировки, но это обычно neglible достаточно для не имения значение.

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

1
ответ дан Scott Dorman 23 September 2019 в 12:46
поделиться

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

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

Для ответа Вы подвергаете сомнению блокировку, не нужно в единственном потоковом приложении, и она действительно имеет побочные эффекты производительности. потому что привязывается, C# основаны на объектах синхронизации ядра и каждой блокировке, которую Вы берете, создает переход к привилегированному режиму от непривилегированного режима.

, Если Вы интересуетесь выполнением многопоточности, хорошее место для запуска MSDN, распараллеливающий инструкции

2
ответ дан Pop Catalin 23 September 2019 в 12:46
поделиться

Посмотрите вопрос о 'Взаимном исключении' в C#. И затем взгляд эти два вопросы относительно использования 'блокировки (Объектный)' оператор конкретно.

1
ответ дан Community 23 September 2019 в 12:46
поделиться

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

0
ответ дан Quibblesome 23 September 2019 в 12:46
поделиться

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

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

1
ответ дан Yes - that Jake. 23 September 2019 в 12:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: