Vediamo innanzitutto come instanziare ed avviare due thread.

Nel nostro esempio, i due thread simulano del lavoro intensivo da eseguire in background e ritornano.
 
static bool done = false;
 
...
 
Thread a = new Thread(task);
a.Start();
 
Thread b = new Thread(task);
b.Start();
 
.....
 
 
static void task()
        {
            if (!done)
            {
                Thread.Sleep(5000);
                done = true;
                Console.WriteLine("Done");
            }
        }
Grazie all'uso della variabile booleana "done", potremmo aspettarci che solo uno dei due thread entri nel blocco if. Se, però, eseguiamo il codice, notiamo che "Done" viene stampato due volte.
Anche se esposto in maniera banale, questo è un tipico problema della condivisione di oggetti in blocchi di codice concorrente.
Per risolvere la situazione, C# fornisce una semplice istruzione: il lock.

static readonly object locker = new object();
 
...
 
static void task()
        {
            lock (locker)
            {
                if (!done)
                {
                    Thread.Sleep(5000);
                    done = true;
                    Console.WriteLine("Done");
                }
            }
 
        }
Lanciando il programma osserveremo che "Done" verrà stampato una sola volta.
comments powered by Disqus