Читаем C# 4.0: полное руководство полностью

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

В приведенном ниже примере программы демонстрируется применение двух методов из класса Interlocked: Increment() и Decrement(). При этом используются следующие формы обоих методов:

public static int Increment(ref int location)

public static int Decrement(ref int location)

где location — это переменная, которая подлежит инкрементированию или декрементированию.

// Использовать блокируемые операции.

using System;

using System.Threading;

// Общий ресурс,

class SharedRes {

  public static int Count = 0;

}

// В этом потоке переменная SharedRes.Count инкрементируется,

class IncThread {

  public Thread Thrd;

  public IncThread(string name) {

    Thrd = new Thread(this.Run);

    Thrd.Name = name;

    Thrd.Start();

  }

  // Точка входа в поток,

  void Run() {

    for(int i=0; i<5; i++) {

      Interlocked.Increment(ref SharedRes.Count);

      Console.WriteLine(Thrd.Name + " Count = " + SharedRes.Count);

    }

  }

}

// В этом потоке переменная SharedRes.Count декрементируется,

class DecThread {

  public Thread Thrd;

  public DecThread(string name) {

    Thrd = new Thread(this.Run);

    Thrd.Name = name;

    Thrd.Start();

  }

  // Точка входа в поток,

  void Run() {

    for(int i=0; i<5; i++) {

      Interlocked.Decrement(ref SharedRes.Count);

      Console.WriteLine(Thrd.Name + " Count = " + SharedRes.Count);

    }

  }

}

class InterlockedDemo {

  static void Main() {

    // Сконструировать два потока.

    IncThread mt1 = new IncThread("Инкрементирующий Поток");

    DecThread mt2 = new DecThread("Декрементирующий Поток");

    mt1.Thrd.Join();

    mt2.Thrd.Join();

  }

}

<p>Классы синхронизации, внедренные в версии .NET Framework 4.0</p>

Рассматривавшиеся ранее классы синхронизации, в том числе Semaphore и AutoResetEvent, были доступны в среде .NET Framework, начиная с версии 1.1.

Таким образом, эти классы образуют основу поддержки синхронизации в среде .NET Framework. Но после выпуска версии .NET Framework 4.0 появился ряд новых альтернатив этим классам синхронизации. Все они перечисляются ниже.

Класс - Назначение

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

CountdownEvent - Выдает сигнал, когда обратный отсчет завершается

ManualResetEventSlim - Это упрощенный вариант класса ManualResetEvent

semaphoreslim - Это упрощенный вариант класса Semaphore

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

<p>Прерывание потока</p>

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

Для прерывания потока до его нормального завершения служит метод Thread.Abort(). Ниже приведена простейшая форма этого метода.

public void Abort()

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных