Асинхронно ли и ожидают ли продукты, приобретают и выпускают семантику? - PullRequest
0 голосов
/ 13 марта 2019

Я не смог найти четкого ответа о том, всегда ли возвращение из метода async приводит к семантике выпуска, и всегда ли await производит семантику получения. Я предполагаю, да, потому что в противном случае любой код async/await был бы минным полем?

Итак, вот пример: гарантированные ли возвращаемые значения равны 100*2 и 12345*2, без каких-либо явных блокировок или барьеров?

private static async Task<(int, int)> AMethod()
{
    // Runs on the original thread:
    var x = 100;
    var y = 12345;

    var task = Task.Run(() =>
    {
        // Can run on another thread:
        x *= 2;
        y *= 2;

        // Implicit return here, marking the task completed.
        // Release semantics or not?
    });

    await task; // Acquire semantics or not?

    // Runs on the original thread:
    return (x, y);
}

РЕДАКТИРОВАТЬ: Конечно, Task.Run также необходимо произвести выпуск, и приобретение необходимо при запуске кода задачи. Забыл про тех в оригинальном вопросе.

1 Ответ

3 голосов
/ 13 марта 2019

Да, возвращаемые значения гарантированно равны 100*2 и 12345*2, без каких-либо явных блокировок или барьеров.

Это Task.Run, а не await, который производит памятьБарьер в этом случае.

Процитируем замечательный Албахари Потоки в C # :

Следующие неявно генерируют полные заборы:

  • Все методы класса Interlocked (мы рассмотрим их в ближайшее время)
  • Асинхронные обратные вызовы, использующие пул потоков -к ним относятся асинхронные делегаты, обратные вызовы APM и продолжения задач
  • Установка и ожидание на сигнальной конструкции
  • Все, что зависит от сигнализации, например запуск или ожидание на задаче

В силу этого последнего пункта потокобезопасно следующее:

int x = 0;
Task t = Task.Factory.StartNew (() => x++);
t.Wait();
Console.WriteLine (x);    // 1

Task.Run wraps ThreadPool.UnsafeQueueUserWorkItem, который подпадает под "Асинхронные обратные вызовы, использующие пул потоков ".

См. Генераторы барьеров памяти для более полного списка вещей, которые создают барьеры памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...