7

Jan

[TIP] ThreadStatic - E ogni thread avrà la sua propria istanza

Ciao a tutti

 

vediamo un attimo l’attributo spesso inutilizzato ThreadStatic

 

se eseguo del codice in un contesto multi-threaded, come ad esempio un processo in background (BackgroundWorker), o un Task, o uso PLinq

qualunque variabile visibile dal codice che gira nei thread, sarà condivisa da questi, con: o eventuali problemi di corruzione se si utilizzano oggetti non ThreadSafe, o problemi di sincronizzazione e/o lock se ne andiamo ad usare a iosa per recuperare il problema precedente

ma se ci serve condividere quel valore non possiamo inventarci altre soluzioni

se invece vogliamo preservare il valore, e renderlo locale allo stack non più del thread chiamante poi condiviso su tutti i thread creati, ma direttamente locale allo stack di ogni singolo thread creato, basta appunto aggiungere l’attributo ThreadStatic

 

SENZA:

static int condivisaDaiThread = 0;

static void Main(string[] args)
{
    Task.Run(new Action(InTaskProcess));
    Task.Run(new Action(InTaskProcess));
   
    Console.ReadLine();
}

public static void InTaskProcess()
{
    for (int i = 0; i < 10; i++)
        Console.WriteLine(condivisaDaiThread++);
}

 

esenguendo questo codice, C alla fine sarà 20

 

CON:

 

[ThreadStatic]
static int condivisaDaiThread = 0;

static void Main(string[] args)
{
    Task.Run(new Action(InTaskProcess));
    Task.Run(new Action(InTaskProcess));
   
    Console.ReadLine();
}

public static void InTaskProcess()
{
    for (int i = 0; i < 10; i++)
        Console.WriteLine(condivisaDaiThread++);
}

 

eseguendo questo codice, invece, C avrà valori da 0 a 10 per ogni thread

 

un saluto

by Antonio Esposito on 1/7/2014
Post archive