Параллелизм - как назначить переменную из отдельной задачи? - PullRequest
0 голосов
/ 18 октября 2018

Рассмотрим следующий сценарий:

    |---------------------|------------------|
    |        Task 0       |       Task 1     |
    |---------------------|------------------|
    |        x = 1;       |       y = 1;     |
    |---------------------|------------------|
    |        a = y;       |       b = x;     |
    |---------------------|------------------|

Какое значение a и b в конце одновременных задач?Я понятия не имею, как решить эту проблему.

Каждое назначение выполняется атомарно.В задачах, заявления происходят в порядке.Перед выполнением оба значения x и y устанавливаются в 0.

1 Ответ

0 голосов
/ 20 октября 2018

Вы не можете быть уверены в значениях после выполнения обеих задач, даже если назначения являются атомарными.Это потому, что вы все еще имеете дело с двумя задачами, выполняющимися одновременно, и значения зависят от чередования операторов, которое не может быть гарантировано.Но вы, безусловно, можете создать набор возможных пар значений.

Например, скажем, задача 0 выполняется до завершения, прежде чем задача 1 сможет установить y.У нас есть {a = 0, b = 1}.То же самое можно сказать, когда Задача 1 выполняется до завершения, прежде чем Задача 0 сможет установить x, давая {a = 0, b = 1}, {a = 1, b = 0}.Простой пример оставляет только одну другую возможность, так как они оба не могут быть 0, поэтому окончательный набор будет:

[{a = 0, b = 1}, {a = 1, b =0}, {a = 1, b = 1}]

Как назначить переменную из отдельной задачи?

Самый простой способ избежать проблем с параллелизмом - это не создавать их.Пусть задачи возвращают значения x и y и изолируют мутации a и b в последовательном коде.Задачи зависят друг от друга, так почему бы не извлечь эту зависимость из задачи, где это безопасно?

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