Вы не можете быть уверены в значениях после выполнения обеих задач, даже если назначения являются атомарными.Это потому, что вы все еще имеете дело с двумя задачами, выполняющимися одновременно, и значения зависят от чередования операторов, которое не может быть гарантировано.Но вы, безусловно, можете создать набор возможных пар значений.
Например, скажем, задача 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 в последовательном коде.Задачи зависят друг от друга, так почему бы не извлечь эту зависимость из задачи, где это безопасно?