- •Оглавление
- •Класс Thread. Общая информация.
- •Thread – составляющие
- •Свойства
- •1) В следующем примере кода показаны простейшие функциональные возможности работы с потоками.
- •2)Пример изменения и использования свойств Priotiry, Name, CurrentThread
- •3) Создание потоков в фоновом режиме. Использование свойства IsBackground.
- •4) Ключевое слово lock
- •Interrupt(), Sleep(), SpinWait(), Join()
- •Класс Process Общая информация.
- •Process – составляющие Свойства
- •Примеры:
- •Класс WaitHandle Общая информация.
- •WaitHandle – составляющие Поля
- •Свойства
- •Класс Mutex Общая информация.
- •Mutex – составляющие Свойства
- •Примеры
- •Класс AutoResetEvent Общая информация.
- •AutoResetEvent – составляющие Методы
- •Примеры
- •Класс ManualResetEvent Общая информация.
- •ManualResetEvent – составляющие Методы
- •Примеры
- •Класс Monitor Общая информация.
- •Monitor – составляющие Методы
- •Класс Semaphore
- •Список литературы
Примеры
Пример демонстрирует, как нужно использовать 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
Потокобезопасность:
Этот тип можно использовать в многопоточных операциях.