Для знакомства с основными идеями почитайте "Шаг 80 - Что такое критическая секция (Critical Section)". Совсем коротко - критическая секция это участок кода который имеет доступ к общему ресурсу, например монитор. Если два приложения сразу начнут выводить на монитор будет бардак. Смотрим код.
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. Все зависит от того что первый получи в свое распоряжение время процессора. При работе с критическими секциями нужно иметь ввиду что тут опасность смертельного захвата читайте "N/A".