L'idea è quella di simulare un area comune per differenti thread, e di comprendere come questa debba essere gestita da ogni singolo thread.
Naturalmente l'esempio che riporto è molto lontano dal problema reale, ma abbastanza vicino come "comportamento".
Questa è la mia classe main
class Program { static void Main(string[] args) { ConsoleColor[] cx = new ConsoleColor[3]; Thread[] tx = new Thread[3]; cx[0] = ConsoleColor.Red; cx[1] = ConsoleColor.Yellow; cx[2] = ConsoleColor.Green; for (int i = 0; i < 3; i++) { TestMe tM = new TestMe(cx[i], "T"+i.ToString().PadLeft(3,'0')+" No lock"); Thread t = new Thread(tM.DoNolock); t.Start(); tx[i] = t; } for (int i = 0; i < 3; i++) { tx[i].Join(); } Console.WriteLine("--------------------------------------------"); Console.ReadKey(); for (int i = 0; i < 3; i++) { TestMe tM = new TestMe(cx[i], "T" + i.ToString().PadLeft(3, '0') + " Look"); Thread t = new Thread(tM.DoLock); t.Start(); tx[i] = t; } for (int i = 0; i < 3; i++) { tx[i].Join(); } Console.WriteLine("--------------------------------------------"); Console.ReadKey(); for (int i = 0; i < 3; i++) { TestMeLock tM = new TestMeLock(cx[i], "T" + i.ToString().PadLeft(3, '0') + " New class Look"); Thread t = new Thread(tM.DoWrite); t.Start(); tx[i] = t; } for (int i = 0; i < 3; i++) { tx[i].Join(); } Console.WriteLine("--------------------------------------------"); Console.ReadKey(); } }
Questo le mie due classi di test
La prima
public class TestMeLock { private ConsoleColor _cc; private string _msg = ""; public TestMeLock(ConsoleColor cc, string msg) { object t = new object(); lock (t) { _cc = cc; _msg = msg; } } public void DoWrite() { Console.ForegroundColor = _cc; Console.WriteLine("Start:" + _msg); Thread.Sleep(3000); Console.ForegroundColor = _cc; Console.WriteLine("Done :" + _msg); } }
La seconda ...
public class TestMe { private ConsoleColor _cc; private string _msg = ""; public TestMe(ConsoleColor cc, string msg) { _cc = cc; _msg = msg; } public void DoNolock() { Console.ForegroundColor = _cc; Console.WriteLine("Start:" + _msg); Thread.Sleep(3000); Console.ForegroundColor = _cc; Console.WriteLine("Done :" + _msg); } public void DoLock() { object t = new object(); lock (t) { Console.ForegroundColor = _cc; Console.WriteLine("Start:" + _msg); Thread.Sleep(3000); Console.ForegroundColor = _cc; Console.WriteLine("Done :" + _msg); } } }
e questo è l'output...
Nel primo caso mi attendevo un risultato simile.. ma nel secondo e nel terzo onestamente no...
Eppure mi pare di comprendere che il concetto di area comune, si possa gestire meglio che con una lock ... ( che per altro ho scritto come LOOK perchè del resto sono alla moda ) ...
Il mio scopo è quindi comprendere perchè questa sovrapposizione si verifica del resto mi pare evidente che ogni singolo thread abbia le sue variabili, e che la console sia correttamente sollecitata, eppure i colori non tornano.
Ci lavoro un po' su e vi farò sapere.
Nessun commento:
Posta un commento