Обоснование ограничений возобновляемых функций

В статье о возобновляемые функции, в разделе об ограничениях перечислены три ограничения:

  • Возобновляемые функции не могут использовать переменное количество аргументов. В ситуациях, когда необходимы переменные, развертывание аргументов может быть помещено в функцию, вызывающую возобновляемую функцию после выполнения развертывания аргументов.
  • Тип возврата возобновляемой функции должен быть future<T> или же shared_future<T>, Ограничения на T определяются как std::futureне это предложение, но T должен быть копируемого или подвижного типа, или ‘void». Также должна быть возможность построить переменную T без аргумента; то есть он должен иметь доступный (неявный или явный) конструктор по умолчанию, если он относится к типу класса.
  • Выражения ожидания могут не появляться в теле обработчика исключений и не должны выполняться, пока исполняющая нить удерживает блокировку любого вида.

За этими ограничениями должна быть причина, и из-за недостатка знаний о параллелизме я не могу понять, каковы причины. Может ли кто-нибудь рассказать мне об этой теме?

Переменное количество аргументов

Это ограничение относится к вариационным функциям в стиле C или шаблонным вариативным функциям C ++ 11?

  • Если это стиль C, причина ограничения связана с магический обман сделано va_* макросы?
  • Если это относится к функциям шаблонных переменных, я предполагаю, что ограничение должно быть связано с распаковкой пакета параметров, а не с тем фактом, что эта функция является шаблонной (нет никаких формулировок о функциях с возможностью восстановления шаблонов, поэтому я предполагаю, что они юридическое).

В обоих случаях я думал, что компилятор может быть достаточно умен, чтобы определить, какую функцию использовать.

Конструкционный и копируемый / подвижный тип по умолчанию

Я понимаю причину возврата std::future или же std::shared_future, но я предполагаю, что причина ограничения используемых типов связана с типами, которые могут использовать фьючерсы.

Таким образом, в статье предлагается расширить язык двумя новыми ключевыми словами (resumable и await), которые обеспечивают поведение возобновляемых функций, но, в конце концов, он доверяет существующим конструкциям передавать возвращаемые значения возобновляемых функций между функцией и вызывающей стороной.

Почему бы не предложить какое-то расширение языка для возвращаемых значений? это может (возможно) снять ограничение по умолчанию для конструируемых и копируемых / подвижных типов и исправить асимметрию между возвращаемым типом и возвращаемым типом:

Таким образом, следует отметить, что существует асимметрия между наблюдаемым поведением функции извне (вызывающей стороной) и изнутри: внешняя перспектива состоит в том, что функция возвращает значение типа future<T> в первой точке приостановки, в то время как внутренняя перспектива состоит в том, что функция возвращает значение типа T с помощью оператора возврата (…)

Нет ожидающих обработчиков исключений или ожидаемых заблокированных потоков

Полагаю, что ожидать чего-то при обнаружении исключения не имеет смысла, но я понятия не имею об ограничении заблокированных потоков.

6

Решение

Я почти уверен, что все эти ограничения связаны с тем, что контекст возобновляемой функции должен быть «сохранен» и «возобновлен» — я ожидаю, что механизм создаст временную «копию стека» или что-то подобное. Так:

  • Переменное количество аргументов

    Это действительно означает, что вещи используют va_arg функциональность — не потому, что задействованы макросы, а потому, что внешнему агенту невозможно узнать количество фактических аргументов — для printf, вам нужно прочитать строку формата, для некоторых других последний отмечен NULL, Так сколько контекста нужно сохранить?

  • Закрытые темы

    Итак, мы только что сказали «мы не хотим, чтобы этот поток прерывался», а затем мы идем и говорим: «Теперь давайте запустим что-то еще». Это все равно что сказать: «Пожалуйста, ни при каких обстоятельствах меня не будут прерывать, пока я принимаю ванну», когда я захожу в ванну, и в то же время говорю: «Можете ли вы позвонить мне через 2 минуты …» — при условии, что ванна занимает больше 2 минут, одно из них будет неверным.

  • Конструктор по умолчанию

    Я вполне уверен, что логика здесь в том, что это сделало бы всю концепцию достаточно сложной, если бы возвращаемое значение, которое должно быть сконструировано, должно было передавать аргументы конструктору. Как бы вы описали такую ​​вещь? И вам также придется «держаться» за эти аргументы, находясь в состоянии ожидания. Опять же, делая сохранение контекста более сложным.

3

Другие решения


По вопросам рекламы [email protected]