Будущее::wait() синхронизируется с завершением потока выполнения async()?

Говорят, что thread::join() синхронизируется с завершением соответствующего потока выполнения. Мне интересно, относится ли то же самое к async() а также future::wait(), Так, например:

std::atomic_int v(0);
std::async(
  std::launch::async,
  [&v] { v.fetch_add(1, std::memory_order_relaxed); }
).wait();
assert(v.load(std::memory_order_relaxed) == 1);

assert() никогда не подведет.

1 ответ

Решение

Прямо из N3337 ( C++11 стандартная версия), [futures.async] / 5 с моим акцентом:

Синхронизация: независимо от предоставленного аргумента политики,

  • вызов async синхронизируется с ([intro.multithread]) вызовом f. [Примечание: этот оператор применяется, даже когда соответствующий будущий объект перемещается в другой поток. - конечная нота]; а также

  • завершение функции f выполняется до ([intro.multithread]) общего состояния, когда оно готово. [Примечание: f может вообще не вызываться, поэтому его завершение может никогда не произойти. - конец примечания]

Если реализация выбирает launch::async политика,

  • вызов ожидающей функции для асинхронного возвращаемого объекта, который разделяет общее состояние, созданное этим асинхронным вызовом, должен блокироваться до тех пор, пока связанный поток не завершится, как если бы он был присоединен ([thread.thread.member]);

  • завершение связанного потока синхронизируется с ([intro.multithread]) возвратом из первой функции, которая успешно определяет состояние готовности общего состояния, или с возвратом из последней функции, которая освобождает общее состояние, в зависимости от того, что произойдет раньше.

Итак, если обратиться к вашему вопросу, это означает, что да, утверждение никогда не подведет.

Другие вопросы по тегам