Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка для КР по ООП.doc
Скачиваний:
8
Добавлен:
18.04.2019
Размер:
2.47 Mб
Скачать

Очереди. Основа интерфейса взаимодействия

Queue – класс, представляющий коллекцию объектов (objects), работающую по принципу “первый пришёл, первый ушёл” (first-in, first-out).

Stack - класс, представляющий коллекцию объектов (objects), работающую по принципу “последний пришёл, первый ушёл” (last-in, first-out).

Безопасность данных и критические секции кода

Некоторое значение, связанное с конкретным объектом, подвергается воздействию (изменению, преобразованию) со стороны потока. Это означает, что по отношению к объекту (значению объекта) применяется некоторая фиксированная последовательность операторов, в результате которой происходит КОРРЕКТНОЕ изменение состояния объекта или его значения.

В многопоточном приложении один и тот же объект может быть подвергнут одновременному “параллельному” воздействию со стороны нескольких потоков. Подобное воздействие представляет опасность для объекта и его значения, поскольку в этом случае порядок применения операторов из нескольких потоков (пусть даже и содержащих одни и те же операторы) неизбежно будет изменён.

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

Управление последовательностью доступа потоков к объекту называют синхронизацией потоков.

Сам же объект называют объектом синхронизации.

Типичными средствами синхронизации потоков являются:

  • критические секции,

  • мониторы,

  • мьютексы.

Пример организации многопоточного приложения

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

using System;

using System.Threading;

namespace threads12

{

class TextPresentation

{

Mutex mutex = new Mutex(false);

public void showText(string text)

{

int i;

// Объект синхронизации в данном конкретном случае -

// представитель класса TextPresentation. Для его обозначения используется

// первичное выражение this.______________________________________________

//1. Блокировка кода монитором (начало)// Monitor.Enter(this);

//2. Критическая секция кода (начало)// lock(this)

//2. Критическая секция кода (начало)// {

mutex.WaitOne();//3.Блокировка кода мьютексом (начало)//

Console.WriteLine(“\n” + (char)31 + (char)31 + (char)31 + (char)31);

for (i = 0; i < 250; i++)

{

Console.Write(text);

}

Console.WriteLine(“\n” + (char)30 + (char)30 + (char)30 + (char)30);

mutex.Close();//3.Блокировка кода мьютексом (конец)//

//2. Критическая секция кода (конец)// }

//1. Блокировка кода монитором (конец)

// Monitor.Exit(this);

}

}

class threadsRunners

{

public static TextPresentation tp = new TextPresentation();

public static void Runner1()

{

Console.WriteLine(“thread_1 run!”);

Console.WriteLine(“thread_1 - calling TextPresentation.showText”);

tp.showText(“*”);

Console.WriteLine(“thread_1 stop!”);

}

public static void Runner2()

{

Console.WriteLine(“thread_2 run!”);

Console.WriteLine(“thread_2 - calling TextPresentation.showText”);

tp.showText(“|”);

Console.WriteLine(“thread_2 stop!”);

}

static void Main(string[] args)

{

ThreadStart runner1 = new ThreadStart(Runner1);

ThreadStart runner2 = new ThreadStart(Runner2);

Thread th1 = new Thread(runner1);

Thread th2 = new Thread(runner2);

th1.Start();

th2.Start();

}

}

}