tabs ↹ over ␣ ␣ ␣ spaces

by Jiří {x2} Činčura

Synchronizace threadů

28 Dec 2005 1 mins .NET

Včera jsem se pokušel napsat příklad, který by demonstroval co se stane, pokud thready využívající sdílený prostředek nejsou synchronizovány. Jak asi každý ví, že se to tam a tam může pokazit, snaží se automaticky myslet tak, aby tomuto nedeterministickému chování předešel. Já jsem však potřeboval napsat příklad, který by toto záměrně porušoval. Pachtil jsem se s tim poměrně dlouho – myslel jsem si, že špatný příklad lehce dokážu vytvořit – a hle, není to tak jednoduché. 😃

Pokud by tedy někdo potřeboval příklad, který by toto ukázal, může využít tento (těžce vymyšlený 😃 ):

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace synchro
{
	class Program
	{
		public static int globalni = 0;
		static void Main(string[] args)
		{
			for (int i = 0; i < 5; i++)
			{
				ThreadStart ts = new ThreadStart((new Worker()).Run);
				new Thread(ts).Start();
			}
			Console.ReadKey();
		}
	}
	class Worker
	{
		public Worker()
		{
		}
		public void Run()
		{
			//lock(typeof(Program))
			{
				int i = Program.globalni;
				i++;
				Thread.Sleep(new Random().Next(2000));
				Program.globalni = i;
				Console.WriteLine(Program.globalni.ToString());
			}
		}
	}
}

Profile Picture Jiří Činčura is .NET, C# and Firebird expert. He focuses on data and business layers, language constructs, parallelism, databases and performance. For almost two decades he contributes to open-source, i.e. FirebirdClient. He works as a senior software engineer for Microsoft. Frequent speaker and blogger at www.tabsoverspaces.com.