lunedì 25 marzo 2013

Aree Condivise e Lock

In questi giorni, mi sta facendo impazzire un argomento che dovrebbe essere lineare eppure sembra non essere così.. mi è complesso capire perchè ( non è complesso si tratta di retorica come nella buona parte dei casi).

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: