33 Thread support library [thread]

33.6 Futures [futures]

33.6.5 Shared state [futures.state]

Многие из классов, представленных в этом подпункте, используют некоторое состояние для передачи результатов. Он shared state состоит из некоторой информации о состоянии и некоторой информации (возможно, еще не оцененной) result, которая может быть (возможно, недействительной) значением или исключением. [ Note: Фьючерсы, обещания и задачи, определенные в этом пункте, ссылаются на такое совместно используемое состояние. ] end note

[ Note: Результатом может быть любой объект, включая функцию для вычисления этого результата, как это используется async when policy is launch​::​deferred. ] end note

An asynchronous return object - это объект, который считывает результаты из общего состояния. Объект waiting function асинхронного возврата - это объект, который потенциально блокирует ожидание готовности общего состояния. Если ожидающая функция может вернуться до того, как состояние будет подготовлено из-за тайм-аута ([thread.req.lockable]), то это a timed waiting function, в противном случае - non-timed waiting function.

An asynchronous provider - это объект, который предоставляет результат для общего состояния. Результат общего состояния устанавливается соответствующими функциями асинхронного провайдера. [ Note: Например, обещания или задачи. ] Средства установки результата общего состояния указаны в описании тех классов и функций, которые создают такой объект состояния.end note

Когда говорится, что асинхронный возвращаемый объект или асинхронный провайдер освобождает свое общее состояние, это означает:

  • если возвращаемый объект или поставщик содержит последнюю ссылку на его совместно используемое состояние, совместно используемое состояние уничтожается; а также

  • возвращаемый объект или поставщик отказывается от ссылки на свое общее состояние; а также

  • эти действия не будут блокировать общее состояние, чтобы стать готовым, за исключением того, что они могут блокироваться, если выполняются все следующие условия: общее состояние было создано вызовом std​::​async, общее состояние еще не готово, и это была последняя ссылка в общее состояние.

Когда говорят, что асинхронный провайдер готовит свое общее состояние, это означает:

  • во-первых, провайдер отмечает свое общее состояние как готовое; а также

  • во-вторых, провайдер разблокирует все агенты выполнения, ожидающие готовности его общего состояния.

Когда говорится, что асинхронный провайдер отказался от своего общего состояния, это означает:

  • во-первых, если это состояние не готово, провайдер

    • сохраняет объект исключения типа future_­error с условием ошибки в broken_­promise пределах его общего состояния; а потом

    • делает свое разделяемое состояние готовым;

  • во-вторых, провайдер освобождает свое общее состояние.

Общее состояние возможно ready только в том случае, если оно содержит значение или исключение, готовое к извлечению. Ожидание готовности общего состояния может вызвать код для вычисления результата в ожидающем потоке, если это указано в описании класса или функции, создающей объект состояния.

Вызов функций, которые успешно устанавливают сохраненный результат общего состояния, synchronize with вызывает функции, успешно обнаруживающие состояние готовности, являющееся результатом этого параметра. Сохранение результата (нормального или исключительного) в совместно используемом состоянии synchronizes with - успешный возврат из вызова функции ожидания в совместно используемом состоянии.

Некоторые функции (например promise​::​set_­value_­at_­thread_­exit) задерживают подготовку общего состояния до завершения вызывающего потока. Уничтожение каждого из объектов этого потока с помощью thread storage duration упорядочивается до того, как это общее состояние будет готово.

Доступ к результату того же общего состояния может conflict. [ Note: Это явно указывает, что результат общего состояния виден в объектах, которые ссылаются на это состояние в смысле data race avoidance. Например, одновременный доступ через ссылки, возвращаемые shared_­future​::​get() ([futures.shared_future]), должен использовать операции только для чтения или обеспечивать дополнительную синхронизацию. ]end note