Manual reset event
Коли один з потоків робить певну частину коду, інші мають зачекати до сигналу
Коли не має певної ділянки коду, яку треба заблокувати між потоками
Коли пишемо в файл, забороняємо його читати в цей час
static ManualResetEvent mre = new ManualResetEvent(false);
static void Main(string[] args)
{
// new Thread(Write).Start();
Task.Run(() => Write());
for (int i = 0; i < 5; i++)
{
// new Thread(Read).Start();
Task.Run(() => Read());
}
Console.ReadKey();
}
public static void Write() {
Console.WriteLine("START WRITING> " + Thread.CurrentThread.ManagedThreadId);
mre.Reset(); // заборонити доступ
Thread.Sleep(5000);
Console.WriteLine("END WRITING " + Thread.CurrentThread.ManagedThreadId);
mre.Set(); // Сигнал, можна іншим потокам отримати доступ
}
public static void Read() {
Console.WriteLine("START R> " + Thread.CurrentThread.ManagedThreadId);
mre.WaitOne();
Thread.Sleep(2000);
Console.WriteLine("END R " + Thread.CurrentThread.ManagedThreadId);
}
START WRITING> 11
START R> 12
START R> 13
START R> 14
START R> 15
START R> 16
END WRITING 11
END R 12
END R 15
END R 14
END R 16
END R 13