Терминология, по-видимому, объяснена в p0099r1: «Низкоуровневый API для стекового переключения контекста» , который говорит:
Примечания по терминологии приостановки и приостановки. Условия приостановки
и приостановки были введены в документ N4232 2 и перенесены
в P0158 9 для различения без стеков (приостановка) и с накоплением (
приостановка) переключение контекста. Эти условия зависят от конкретного
Визуализация операции вызова функции C ++, в которой вызов
функция передает управление «вниз», тогда как возвращается из функции
передает контроль «вверх». Авторы рекомендуют условия
Suspend-by-return вместо приостановки, и Suspend-by-call вместо
из
приостановка . Рекомендуемая терминология напрямую ссылается на
лежащие в основе C ++ операции, не требуя конкретного
визуализации.
приостановка за возвратом ( приостановка или контекст без стеков)
переключение) основан на возврате управления от вызываемой функции к ее
вызывающий, наряду с некоторыми указаниями относительно того, является ли вызываемая функция
завершил и возвращает результат или просто приостанавливает и
ожидает повторного вызова. Тело вызываемой функции закодировано в
таким образом, что - если он приостановлен - вызов его снова будет направлять
контроль до точки, с которой он в последний раз вернулся. Это описывает как
P0057 6 возобновляемых функций и более ранних технологий, таких как
Boost.Asio сопрограммы. 12
приостановить по вызову ( приостановить , или
«Стековое» переключение контекста) основано на вызове функции, которая,
прозрачно для вызывающего абонента, переключается на какую-то другую логическую цепочку
записи активации функции. (Это может быть или не быть смежным
Площадь стека. Регистр указателя стека процессора, если таковой имеется, может или может
не участвовать.) Это описывает N4397 3 сопрограмм, а также
Boost.Context, 13 Boost.Coroutine2 14 и Boost.Fiber. 15
std :: execute_context <> :: operator () () требует приостановки по вызову
семантика.
Оба являются старыми документами и отделены от p0057 , который, кажется, является основным сопрограммным документом. В p0444 обсуждается попытка объединить эти документы, но, похоже, они никуда не делись. Также см. Отчет о поездке: Совещание по стандартам C ++ в Иссакуа, ноябрь 2016 года , в котором говорится:
Coroutines TS содержит предложение co_await, основанное на оригинальном дизайне Microsoft.
Как упоминалось ранее, в настоящее время предпринимаются усилия по стандартизации предложения для другого, сложного аромата сопрограмм, а также исследовательские усилия по объединению двух ароматов в рамках общего синтаксиса. Эти предложения, однако, в настоящее время не нацелены на TS сопрограмм. Вместо этого они могут нацеливаться на другой TS (и, если появится унифицированный синтаксис, это может быть тот синтаксис, а не тот, что в TS Coroutines, который в конечном итоге объединится со стандартом C ++).