int arg=0;
это происходит до мы запускаем поток thr
, поскольку он упорядочен до it.
arg = 10;
это происходит-до vec
инициализируется из-за вызова .get()
:
auto vec=fut.get();
, который упорядочен до-до
std::cout << arg << std::endl;
поэтому я не вижу здесь никакой гонки данных.
Хотя это и не авторитетно, cpp reference претензий:
Обещание - это "толчок" конца обещания-будущегоканал связи: операция, которая хранит значение в общем состоянии, синхронизирует с (как определено в std :: memory_order) успешный возврат из любой функции, которая ожидает в общем состоянии (например, std :: future :: get).
есть похожие слова и для std::async
.Я полагаю, что аналогичная гарантия действует для packaged_task
;он предназначен для использования в качестве примитива, чтобы помочь реализовать ваше собственное std::async
подобное поведение в конце концов.