Совсем коротко - критическая секция это участок кода который имеет доступ к общему ресурсу, например монитор. Если два приложения сразу начнут выводить на монитор будет бардак. Смотрим код.
using System;
using System.Threading;
class MainClass
{
public static Object sync = "var lock";
public static void Main(string[] args)
{
Thread thread1 = new Thread(new ThreadStart(Proc1));
Thread thread2 = new Thread(new ThreadStart(Proc2));
thread1.Start();
thread2.Start();
}
public static void Proc1()
{
lock(sync)
{
for (int i=1;i<100;i++)
Console.WriteLine(i);
Console.WriteLine("Proc1");
}
}
public static void Proc2()
{
lock(sync)
{
for (int i=1;i<100;i++)
Console.WriteLine(i);
Console.WriteLine("Proc2");
}
}
}
Основа кода это lock. Вот такой вид у нее.
lock(переменная)
{
//критический код по работе с ресурсом.
}
В нашем примере мы блокируем переменную sync. Пока она заблокирована то вторая процедура не сможет иметь доступ к ней и будет стоять на месте. Какая вперед начнет работать от того кто первый захватит ресурс. У меня было что первой выполнялась Proc2. Все зависит от того что первый получи в свое распоряжение время процессора. При работе с критическими секциями нужно иметь ввиду что тут опасность смертельного захвата.
