Wenn ein Thread A einen anderen Thread B mit dem einzigen Zweck erzeugt, in eine Variable V zu schreiben und dann darauf wartet, dass er beendet wird, sind Speicherbarrieren erforderlich, um sicherzustellen, dass nachfolgende Lesevorgänge von V auf Thread A frisch sind? Ich bin mir nicht sicher, ob es implizite Barrieren bei den Beendigungs-/Beitrittsvorgängen gibt, die sie überflüssig machen.Sind beim Verbinden eines Threads Speicherbarrieren erforderlich?
Hier ist ein Beispiel:
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;
}
entweder/beide (oder mehrere) der Barrieren in den obigen Schnipseln sind erforderlich?
Ich bezweifle, dass beide Speicherbarriere erforderlich ist. Wenn sie dann wären, wäre Thread.Join ziemlich nutzlos und viele Leute wären in Schwierigkeiten. Join wartet, bis der Thread fertig ist, was die Zuweisung des Werts an die Variable beinhalten würde. – Despertar
Siehe diesen Thread: http://stackoverflow.com/questions/6581848/memory-barrier-generators – Laurijssen