Код: Выделить всё
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
Есть ли что-то в async/await, которое устанавливает барьер памяти и фактически гарантирует работу кода?
Обновить (спасибо всем за комментарии).
Чтобы уточнить:
- это правда, что ничто не работает параллельно
- это также правда, что задействовано несколько потоков, и эти потоки получают доступ к общей памяти.
Код: Выделить всё
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
один и тот же поток выбран для разных частей выполнения, локальные кэши потоков не синхронизированы и т. д.)
может произойти сбой, поскольку код увидит устаревшие/поврежденные значения.
м.>
Подробнее здесь: https://stackoverflow.com/questions/798 ... it-allowed
Мобильная версия