Межпотоковая мутация с Task – разрешена ли она?C#

Место общения программистов C#
Ответить
Anonymous
 Межпотоковая мутация с Task – разрешена ли она?

Сообщение Anonymous »

Я не разбираюсь в C#, но у меня есть проект, в котором в нескольких местах я нашел что-то похожее на

Код: Выделить всё

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
Сначала я предположил, что это незаконно (межпотоковая мутация несинхронизированного значения), но затем потратил полдня, пытаясь доказать это, и мне не удалось создать пример, который действительно выявил бы проблему (.net6.0, linux, Release build).
Есть ли что-то в 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»