Одной из проблем возникающих в многопоточной среде является доступ к некоторым переменным. Сразу сказу, что тоже самое можно решить используя 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 который имеет в своем составе две нужный нам функции:
На самое главное, что при вызове этой функции переменная блокируется, и соответственно другие потоки не смогут это переменную изменить. Соответственно в момент блокировки другой поток не изменит и будет ждать, применение подобного метода гарантирует отсутствие конфликтов.