Code: Select all
public class Program
{
private static int[] value = new int[1];
public static async Task Main()
{
Console.WriteLine($"{(Thread.CurrentThread.Name.IsEmpty() ? "Main": Thread.CurrentThread.Name)}/{Thread.CurrentThread.ManagedThreadId}");
value[0] = 123;
await Task.Yield();
Console.WriteLine($"{Thread.CurrentThread.Name}/{Thread.CurrentThread.ManagedThreadId}");
Console.WriteLine($"value={value[0]}");
if (value[0] != 123) throw new Exception("Gotcha!");
}
}
// produces:
// Main/1
// .NET ThreadPool Worker/5
// value=123
Gibt es etwas in async/await, das eine Speicherbarriere einrichtet und tatsächlich sicherstellt, dass der Code funktioniert?
Update (danke an alle für Kommentare).
Zur Klarstellung:
- es stimmt, dass nichts parallel läuft
- es stimmt auch, dass mehrere Threads beteiligt sind und diese Threads auf den gemeinsam genutzten Speicherort zugreifen
Code: Select all
async Task DoRequestAndStoreResult(int[] data)
{
data[0] = 42; // mutation, first thread
await Task.Yield(); // some actual async work that causes thread switch
data[1] = 42; // mutation, second thread
}
var result = new int[2];
await DoRequestAndStoreResult(result);
// read out and process result
derselbe Thread für verschiedene Teile der Ausführung ausgewählt, Thread-lokale Caches nicht mehr synchron sein usw.)
kann fehlschlagen, wenn der Code veraltete/beschädigte Werte sieht.
m.
Mobile version