Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Межпроцессорное взаимодействие и многопоточность в .NET (реферат).docx
Скачиваний:
30
Добавлен:
28.06.2014
Размер:
139.35 Кб
Скачать

Примеры

  1. Пример демонстрирует, как нужно использовать Mutex для синхронизации доступа к разделяемым данным. Класс – Mutex может использоваться совместно с классом WaitHandle (в отличие от класса Monitor), так как является дочерним от WaitHandle.

using System;

using System.Threading;

class Test

{

//Создаем объект Mutex

private static Mutex mut = new Mutex();

private const int numIterations = 1;

private const int numThreads = 3;

static void Main()

{

//Создаем потоки, которые будут конкурировать за использование

//разделяемых ресурсов

for (int i = 0; i < numThreads; i++)

{

Thread myThread = new Thread(new ThreadStart(MyThreadProc));

myThread.Name = String.Format("Thread{0}", i + 1);

myThread.Start();

}

//Главный поток завершает свою работу, но приложение продолжает

//выполняться, пока все приоритетные потоки не завершат свою работу

}

private static void MyThreadProc()

{

for (int i = 0; i < numIterations; i++)

{

UseResource();

}

}

//Метод UseResource() представляет собой ресурс доступ к которому

//должен быть синхронизирован между потоками. Только один поток

//поток должен иметь доступ к ресурсу

private static void UseResource()

{

//Точка синхронизации(ждем когда можно безопасно

//использовать ресурс)

mut.WaitOne();

Console.WriteLine("{0} has entered the protected area",

Thread.CurrentThread.Name);

// Выполнение некоторой работы

Thread.Sleep(500);

Console.WriteLine("{0} is leaving the protected area\r\n",

Thread.CurrentThread.Name);

// Убираем ресурсы

mut.ReleaseMutex();

}

}

Выходная информация:

Thread1 has entered the protected area

Thread1 is leaving the protected area

Thread3 has entered the protected area

Thread3 is leaving the protected area

Thread2 has entered the protected area

Thread2 is leaving the protected area

Класс AutoResetEvent Общая информация.

Описание:

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

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

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

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

Можно контролировать начальное состояние AutoResetEvent, передав конструктору логическое значение, значение true, если начальное состояние сигнальное, и false в противном случае.

Иерархия:

System.Object    System.MarshalByRefObject       System.Threading.WaitHandle          System.Threading.AutoResetEvent

Определение:

[C#]

public sealed class AutoResetEvent : WaitHandle

Потокобезопасность:

Этот тип можно использовать в многопоточных операциях.