Студопедия  
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Проблемы одновременности и синхронизации потоков. Общий доступ к данным из разных потоков, предотвращение коллизий.

Читайте также:
  1. I. Современное состояние проблемы
  2. II. Проблемы и пути совершенствования проведения актуарных расчетов Испании.
  3. III. Современные задачи и проблемы русской богословской науки и образования.
  4. MCU Poker Charts доступен всем
  5. V. Стратегии ценообразования в зависимости от разных рынков, их сегментов и покупателей
  6. А надежда не постыжает, потому что любовь Божия излилась в сердца наши Духом Святым, данным нам» (Римлянам 5:5).
  7. А. Общий осмотр, исследование сосудов и области сердца
  8. Актуальность проблемы
  9. Актуальность проблемы профессиональной подготовки педагогов и новые подходы к ее решению
  10. Актуальные проблемы теории и практики воспитания и образования.

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

Как избежать подобных непредсказуемых состояний? Для этого можно использовать стандартное средство — синхронизация. Синхронизация позволяет задавать критические секции (critical sections) кода, в которые в каждый отдельный момент может входить только один поток, гарантируя, что любые временные недействительные состояния объекта будут невидимы его клиентам. Имеется несколько средств определения критических секций, включая классы.NET Monitor и Mutex, а также оператор С# lock.

Формат использования инструкции lock таков:

lock(выражение) {

// Инструкции, подлежащие синхронизации.

}

Для обычных методов в качестве выражения используется указатель this, для статических – typeof(класс).

Здесь параметр выражение представляет собой ссылку на синхронизируемый объект. Если нужно синхронизировать только один элемент, фигурные скобки можно опустить. Инструкция lock гарантирует, что указанный блок кода, защищенный блокировкой для данного объекта, может быть использован только потоком, который получает эту блокировку. Все другие потоки остаются заблокированными до тех пор, пока блокировка не будет снята. А снята она будет лишь при выходе из этого блока.

Итак, подытожим действие инструкцииlock.

1. Если для заданного объекта инструкция lock размещена в некотором блоке кода, этот объект блокируется, и никакой другой поток не сможет запросить блокировку.

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

3. Объект разблокируется, когда поток выходит из заблокированного блока.

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




Дата добавления: 2015-09-10; просмотров: 43 | Поможем написать вашу работу | Нарушение авторских прав

Классы библиотеки .NET для работы с потоками | Класс FileStream и файловый ввод-вывод на побайтовой основе. Открытие и закрытие файла. Запись данных в файл. Считывание байтов из объекта класса FileStream. | Файловый ввод-вывод с ориентацией на символы. Использование класса StreamWriter. Использование класса StreamReader. | Считывание и запись двоичных данных. Класс BinaryWriter. Класс BinaryReader. | Public enum FileAttributes | Поставщики данных ADO.NET. Поведение объектов подключения. | Объектная модель ADO.NET | Краткий обзор объектов ADO .NET. | События | Свойства |


lektsii.net - Лекции.Нет - 2014-2024 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав