Шаг 85 - Синхронизация изменения переменной

Одной из проблем возникающих в многопоточной среде является доступ к некоторым переменным. Сразу сказу, что тоже самое можно решить используя lock. Типа:

lock(x)
{
	x=x+1;
}

Но С# позволяет решить задачу увеличения или уменьшения значения переменной легче. Смотрим код:

using System;
using System.Threading;

class MainClass
{
	public static int x;

	public static void Main(string[] args)
	{
		x=0;
		Thread thread1 = new Thread(new ThreadStart(Proc1));
		Thread thread2 = new Thread(new ThreadStart(Proc2));
		thread1.Start();
		thread2.Start();
	}
	
	public static void Proc1() 
	{
		Interlocked.Increment( ref x );
 		Console.WriteLine(x);		
		for (int i=1;i<1000000000;i++) ;
		Interlocked.Decrement( ref x );
		Console.WriteLine("Proc1");
		Console.WriteLine(x);
	}
	
	public static void Proc2() 
	{
		Interlocked.Increment( ref x );
		Console.WriteLine(x);
		for (int i=1;i<1000000000;i++) ;
		Interlocked.Decrement( ref x );
		Console.WriteLine("Proc2");
		Console.WriteLine(x);
	}
	
}

Итак, у нас есть класс Interlocked который имеет в своем составе две нужный нам функции:

На самое главное, что при вызове этой функции переменная блокируется, и соответственно другие потоки не смогут это переменную изменить. Соответственно в момент блокировки другой поток не изменит и будет ждать, применение подобного метода гарантирует отсутствие конфликтов.

gif/85_1.gif (2639 b)


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