Se un thread A genera un altro thread B con il solo scopo di scrivere su una variabile V e quindi attende che termini, sono necessarie barriere di memoria per garantire che le letture successive di V sul thread A siano fresche? Non sono sicuro che ci siano barriere implicite nelle operazioni di terminazione/unione che le rendono ridondanti.Sono necessarie barriere di memoria quando si unisce a un thread?
Ecco un esempio:
public static T ExecuteWithCustomStackSize<T>
(Func<T> func, int stackSize)
{
T result = default(T);
var thread = new Thread(
() =>
{
result = func();
Thread.MemoryBarrier(); // Required?
}
, stackSize);
thread.Start();
thread.Join();
Thread.MemoryBarrier(); // Required?
return result;
}
Sono sono o/sia (o più) delle barriere del frammento precedente richiesta?
Dubito che sia necessaria una barriera di memoria. Se fossero allora Thread.Join sarebbe abbastanza inutile e molte persone sarebbero nei guai. Unire attende fino al termine del thread, che include l'assegnazione del valore alla variabile. – Despertar
Vedi questo thread: http://stackoverflow.com/questions/6581848/memory-barrier-generators – Laurijssen