Ho letto un sacco di discussioni ed esempi su come rendere una proprietà protetta da un thread. C'è uno sulla pagina per this threadsafe wrapper classChe cosa è non sicuro su una semplice proprietà impostata in C#?
L'esempio dato è questo:
internal class MyThreadSafeCass
{
// *** Lock ***
private object PropertyLock = new object();
// *** Property ***
private int m_Property = 0;
// *** Thread-safe access to Property using locking ***
internal int Property
{
get
{
lock (PropertyLock)
{
return m_Property;
}
}
set
{
lock (PropertyLock)
{
m_Property = value;
}
}
}
}
È chiaro quello che sta succedendo qui, e che cosa stanno facendo le serrature, ma sto lottando per capire perché è necessario . Perché è il seguente non thread safe? Cosa può andare storto?
internal class MyThreadSafeCass
{
// *** Property ***
private int m_Property = 0;
// *** Thread-safe access to Property using locking ***
internal int Property
{
get
{
return m_Property;
}
set
{
m_Property = value;
}
}
}
Due thread (o più) non possono accedere alla memoria allo stesso tempo. Con il secondo campione, se due thread accedono contemporaneamente alla variabile, viene generata un'eccezione AccessViolationException. Con il "lock" (o usando l'oggetto Monitor) costringi il secondo thread ad aspettare che il primo thread finisca il suo lavoro. senza violazione. – Yanos
Leggi questo articolo: http://blog.coverity.com/2014/03/12/can-skip-lock-reading-integer/#.VbyOn63EpYQ – Enigmativity
No, non viene generata una 'AccessViolationException' se due thread tentano di accedere a una posizione di memoria nello stesso momento. – user12864