Синхронизация с помощью типа System.Threading.Interlocked

Синхронизация с помощью типа System.Threading.Interlocked

В это всегда верится с трудом, пока вы не проверите соответствующий программный код CIL, но и операции присваивания, и базовые арифметические операции не являются атомарными. Поэтому в пространстве имен System.Threading предлагается тип, позволяющий воздействовать на отдельный элемент данных атомарно с меньшей нагрузкой, чем это делает тип Monitor. Тип класса Interlocked определяет статические члены, описания которых приведены в табл. 14.4.

Таблица 14.4. Члены типа System.Threading.Interlocked

Член Описание
CompareExchange() Безопасно проверяет два значения на равенство, и если они равны, заменяет одно из значений третьим
Decrement() Безопасно уменьшает значение на 1
Exchange() Безопасно меняет два значения местами
Increment() Безопасно выполняет приращение значения на 1

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

public void AddOne() {

 lock(this) {

  intVal++;

 }

}

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

public void AddOne() {

 int newVal = Interlocked.Increment(ref intVal);

}

В дополнение к Increment() и Decrement() тип Interlocked позволяет атомарно присваивать числовые и объектные данные. Например, если вы хотите присвоить члену-переменной значение 83, вы можете избежать необходимости явного использования оператора lock (или явного применения логики Monitor), если используете метод Interlocked.Exchange().

public void SafeAssignment() {

 Interlocked.Exchange(ref myInt, 83);

}

Наконец, при проверке двух значений на равенство, чтобы обеспечить потоковую безопасность элементу сравнения, можете использовать метод Interlocked.CompareExchange(), как показано ниже.

public void CompareAndExchange() {

 // Если значением i является 83, изменить его на 99.

 Interlocked.CompareExchange(ref i, 99, 83);

}

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

2.1.2. Настройка модемного соединения с помощью конфигуратора system-config-network

Из книги Fedora 8 Руководство пользователя автора Колисниченко Денис Николаевич

2.1.2. Настройка модемного соединения с помощью конфигуратора system-config-network Все сетевые соединении в Fedora настраиваются с помощью конфигуратора system-сonfig-network. Но именно для модемного соединения его использовать неудобно - нельзя указать несколько телефонов дозвона, особую


System.DateTime и System.TimeSpan

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

System.DateTime и System.TimeSpan В завершение нашего обзора базовых типов данных позволите обратить ваше внимание на то, что пространство имен System определяет несколько полезных типов данных, для которых в C# не предусмотрено ключевых слов. Это, в частности, типы DateTime и TimeSpan (задачу


Базовые классы System.MulticastDelegate и System.Delegate

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

Базовые классы System.MulticastDelegate и System.Delegate Таким образом, при создании типов c помощью) ключевого слова delegate в C# вы неявно объявляете тип класса, являющегося производным от System.MulticastDelegate. Этот класс обеспечивает своим потомкам доступ к списку с адресами тех методов, которые


Получение Туре с помощью System.Object.GetType()

Из книги Разработка приложений в среде Linux. Второе издание автора Джонсон Майкл К.

Получение Туре с помощью System.Object.GetType() Экземпляр класса Туре можно получить множеством способов. Нельзя только непосредственно создать объект Туре, используя для этого ключевое слово new, поскольку класс Туре является абстрактным. Чтобы привести пример одной из


Получение Туре с помощью System.Type.GetType()

Из книги Компьютерная обработка звука автора Загуменнов Александр Петрович

Получение Туре с помощью System.Type.GetType() Более гибкий подход обеспечивается использованием статического члена GetType() класса System.Type с указанием абсолютного имени соответствующего типа в виде строки. При использовании такого подхода для извлечения метаданных уже не


Пространство имен System.Threading

Из книги Секреты приложений Google автора Балуев Денис

Пространство имен System.Threading В рамках платформы .NET пространство имен System.Threading предлагает ряд типов, позволяющих строить многопоточные приложения. Вдобавок к типам, с помощью которых можно взаимодействовать с отдельными потоками CLR, в этом пространстве имен определены


Класс System.Threading.Thread

Из книги автора

Класс System.Threading.Thread Основным в пространстве имен System.Threading является класс Thread. Этот класс представляет собой объектный контейнер отдельной ветви выполнения в конкретном домене приложения. Он определяет ряд методов (как статических, так и общедоступных), которые позволяют


Синхронизация с помощью ключевого слова lock в C#

Из книги автора

Синхронизация с помощью ключевого слова lock в C# Первой из возможностей, которую вы можете применить в C# для синхронизации доступа к совместно используемым ресурсам, является использование ключевого слова lock. Это ключевое слово позволяет определить контекст операторов,


Синхронизация с помощью типа System.Threading.Monitor

Из книги автора

Синхронизация с помощью типа System.Threading.Monitor Оператор C# lock на самом деле является лишь ключевым словом, обозначающим использование типа класса System.Threading.Monitor. После обработки компилятором C# контекст блокировки превращается в следующее (вы можете убедиться в этом с помощью


Синхронизация с помощью атрибута [Synchronization]

Из книги автора

Синхронизация с помощью атрибута [Synchronization] Последним из рассмотренных здесь примитивов синхронизации будет атрибут [Synchronization], который определяется в пространстве имен System.Runtime.Remoting.Contexts. Этот атрибут уровня класса для безопасности потока эффективно блокирует весь


ГЛАВА 19. Создание окон с помощью System.Windows.Forms

Из книги автора

ГЛАВА 19. Создание окон с помощью System.Windows.Forms Если вы прочитали предыдущие 18 глав, вы должны иметь солидную базу дли использования языка программирования C# и архитектуры .NET. Вы, конечно же, можете применить полученные знания для построения консольных приложений следующего


Основные члены типа System.Web.Ul.WebControls.WebControl

Из книги автора

Основные члены типа System.Web.Ul.WebControls.WebControl Можно сказать, что тип Control предлагает возможности поведения, не относящиеся к графическому интерфейсу. С другой стороны, базовый класс WebControl обеспечивает полиморфный графический интерфейс для всех Web-элементов поведения, как


13.2.1. Синхронизация с помощью критических секций

Из книги автора

13.2.1. Синхронизация с помощью критических секций Простейший способ синхронизации дают критические секции. Когда поток входит в критическую секцию программы, гарантируется, что никакой другой поток не войдет в нее, пока первый не выйдет.Если акцессору Thread.critical присвоить


10.5.1. Запуск и ожидание с помощью system()

Из книги автора

10.5.1. Запуск и ожидание с помощью system() Программам часто требуется запускать другие программы и ожидать их завершения, прежде чем продолжать свою работу. Функция system() позволяет это делать достаточно просто.int system (const char* cmd);system() порождает дочерний процесс, который


Синхронизация

Из книги автора

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


Синхронизация

Из книги автора

Синхронизация Для того чтобы фотографии любого вашего альбома прямо из Picasa появились в Интернете на сервисе Picasa Web Albums, необходимо совершить всего два простых действия. Во-первых, щелкнуть на ссылке «Веб-альбомы» над строкой поиска и ввести данные своей учетной записи