In un C# app, supponiamo di avere una sola classe globale che contiene alcuni elementi di configurazione, in questo modo:C sicurezza # filo di impostazioni di configurazione globale
public class Options
{
int myConfigInt;
string myConfigString;
..etc.
}
static Options GlobalOptions;
i membri di questa classe sarà usi attraverso diversi thread:
Thread1: GlobalOptions.myConfigString = blah;
mentre
Thread2: string thingie = GlobalOptions.myConfigString;
Utilizzo di una serratura per l'accesso ai GlobalOptions l'oggetto sarebbe anche un blocco non necessario quando 2 thread accedono a membri diversi, ma d'altra parte la creazione di un oggetto di sincronizzazione per ogni membro sembra un po 'esagerata.
Inoltre, l'utilizzo di un blocco sulle opzioni globali renderebbe il mio codice meno piacevole, credo; se devo scrivere
string stringiwanttouse;
lock(GlobalOptions)
{
stringiwanttouse = GlobalOptions.myConfigString;
}
ovunque (ed è questo thread-safe o è stringiwanttouse ora solo un puntatore a myConfigString? Sì, Sono nuovo di C# ....) invece di
string stringiwanttouse = GlobalOptions.myConfigString;
rende il codice orribile.
Quindi ... Qual è il modo migliore (e più semplice!) Per garantire la sicurezza del thread?
Penso che sarebbe ancora più chiaro se potessi specificare quale problema stai cercando di risolvere. Non c'è alcun pericolo intrinseco in due thread che impostano un valore globale intorno allo stesso tempo. Il CLR non si arresta in modo anomalo. Che tipo di problema di sincronizzazione stai cercando di risolvere? – PeterAllenWebb
Bene, cosa succede quando un thread sta scrivendo su una stringa mentre un altro sta tentando di leggerlo? Riceverò sempre l'una o l'altra stringa, o potrebbe accadere che io ottenga una stringa parzialmente sovrascritta? – Led