Шаг 84 - Критическая секция

Для знакомства с основными идеями почитайте "Шаг 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. Все зависит от того что первый получи в свое распоряжение время процессора. При работе с критическими секциями нужно иметь ввиду что тут опасность смертельного захвата читайте "Шаг 86 - Что такое смертельный захват(Deadlock) и как с ним бороться".

gif/84_1.gif (1412 b)


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.