В чем разница между режимами приостановки и приостановки? - PullRequest
0 голосов
/ 14 ноября 2018

Сообщество C ++ в настоящее время обсуждает приостановку против сопрограмм приостановки.

Например, в этом предложении упоминается приостановка: http://www.open -std.org / jtc1 / sc22 / wg21 / docs /apers / 2015 / n4453.pdf

Что означают эти два термина?

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

каждая функция создает кадр стека (резервирует место в стеке для локальных переменных и т. Д.)

приостановить деятельность:

  • используется для переключения стека без контекста (сопрограммы ...)
  • поскольку у вас есть только один стек (стек приложений), вы должны удалить кадр стека приостановленной функции (функция сопрограммы без стека)
  • в противном случае другие функции, выполняемые после приостановки сопрограммы, записывают свой собственный кадр стека и, таким образом, повреждают кадр стека приостановленной
  • suspend-up == удалить фрейм стека приостановленной функции == шагнуть по нескольким адресам в стеке вверх (для архитектур, в которых стек увеличивается от высоких до низких адресов)

приостановить вниз:

  • используется для стекового переключения контекста (сопрограммы, волокна, ...)
  • каждая сопрограмма / волокно получает свой собственный стек, поэтому приложение состоит из нескольких стеков
  • если стековая сопрограмма приостановлена, кадр стека остается в стеке (поскольку стек zhr относится к сопрограмме / принадлежит ей)
  • указатель стека просто изменяется на другой стек (== переключается на другую стопку сопрограмм / волокон)
  • , поскольку кадр стека остается в стеке, он называется приостановкой
0 голосов
/ 14 ноября 2018

Терминология, по-видимому, объяснена в 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 ++).

...