Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OSISP Part 3.DOC
Скачиваний:
43
Добавлен:
11.05.2015
Размер:
360.45 Кб
Скачать
  1. Синхронизация программных потоков в среде .Net. Атомарные (Interlocked-) операции.

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

Класс Interlocked выполняет следующие операции.

В платформе .NET Framework версии 2.0 метод Add добавляет к переменной целочисленное значение и возвращает новое значение переменной.

В платформе .NET Framework версии 2.0, метод Read считывает 64-разрядное целочисленное значение в ходе атомарной операции. Это полезно в 32-разрядных операционных системах, где считывание 64-разрядного целого числа обычно не является атомарной операцией.

Методы Increment и Decrement увеличивают или уменьшают переменную и возвращают результирующее значение.

Метод Exchange выполняет атомарный обмен значений для указанной переменной, возвращая текущее значение и заменяя его новым значением. Универсальная перегружаемая версия этого метода в платформе .NET Framework версии 2.0 может использоваться для обмена значений в переменной любого ссылочного типа.

Метод CompareExchange также обменивает два значения, но делает это в зависимости от результата сравнения. Универсальная перегружаемая версия этого метода в платформе .NET Framework версии 2.0 может использоваться для обмена значений в переменной любого ссылочного типа.

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

  1. Прерывание программных потоков в среде .NET. Особенности исключительной ситуации класса ThreadAbortException.

Заблокированный поток может быть преждевременно разблокирован двумя путями:

С помощью Thread.Interrupt.

С помощью Thread.Abort.

Это должно быть сделано из другого потока; ожидающий поток бессилен что-либо сделать в блокированном состоянии.

Interrupt

Вызов Interrupt для блокированного потока принудительно освобождает его с генерацией исключения ThreadInterruptedException.

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

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

Вызов Interrupt без должных на то оснований таит в себе опасность, так как любой метод framework-а, или другой сторонний метод в стеке вызовов может получить его раньше, чем ваш код, которому он предназначался. Все, что для этого требуется – чтобы поток хотя бы кратковременно встал на простой блокировке или синхронизации доступа к ресурсу, и любой ждущий своего часа Interrupt тут же сработает. Если метод изначально не разрабатывался с учетом возможности такого прерывания (с соответствующим кодом очистки в блоках finally), объекты могут остаться в неработоспособном состоянии, или ресурсы будут освобождены не полностью.

Прерывать исполнение потока безопасно, если вы точно знаете, чем сейчас занят поток.

Блокированный поток также может быть принудительно освобожден при помощи метода Abort. Эффект аналогичен Interrupt, только вместо ThreadInterruptedException генерируется ThreadAbortException. Кроме того, это исключение будет повторно сгенерировано в конце блока catch (в попытке успокоить поток навеки), если только в блоке catch не будет вызван Thread.ResetAbort. До вызова Thread.ResetAbort ThreadState будет иметь значение AbortRequested.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]