Sunday, December 01, 2013

Resumable функции

На прошлой неделе в мире С++ произошло интересное событие. Компания Microsoft объявила о выходе обновления к компилятору С++ в Visual Studio 2013. Само по себе обновление компилятора отдельно от Visual Studio или её сервис-пака — уже нетривиальное для Microsoft событие. Но ещё интереснее то, что вошло в это обновление. Полный список можно почитать по ссылке выше, а я остановлюсь только на одном моменте — resumable функции. Для полного понимания ситуации: Microsoft изрядно протроллила и комитет по стандартизации С++ и разработчиков gcc\clang, выпустив (тут надо внимательно) реализацию экспериментальной и не утверждённой ещё возможности будущего стандарта C++17, основанной на экспериментальных и не утверждённых ещё возможностях будущего стандарта C++14, которые в свою очередь являются исправлениями не сильно ещё вошедших в повседневное программирование возможностей С++11. 

Достаточно гиковский ход, не находите?

А ниже будет перевод статьи с meetingcpp.com, рассказывающей о том, что это за фича и как её использовать.


На прошедшей недавно конференции BUILD Херб Саттер рассказывал о будущем языка С++. Его доклад был полон красивых примеров на С++11 и С++14. И вдруг, прямо из ниоткуда — resumable функции. Херб — один из авторов документа, описывающего std::future и resumable функции, так что само их упоминание не было для меня сюрпризом, но вот что меня удивило, так это то, сколько внимания он уделил этой теме и упоминание того факт, что resumable функции войдут в обновление к Visual Studio 2013 (пусть не в сам релиз VS2013, но всё же намного раньше следующей версии IDE).

Я начну с небольшого спойлера: это возможность как минимум С++1y, она не войдёт в С++14, но в дальнейшем именно асинхронное и параллельное программирование будет в тренде развития языка, так что resumable функции станут органичной частью нового стандарта. В дальнейшем эта фича будет поддерживаться всеми компиляторами, а на данный момент Microsoft шагает впереди планеты всей с собственной реализацией. Не секрет, что данная функциональность имеет некоторую аналогию с async/await из языка C#.

Что такое resumable функции?

Это, вообще-то и есть главный вопрос, который мы тут пытаемся выяснить. Прежде чем я начну объяснять, чем бы это могло быть и как их определяет документ N3650, я должен сделать небольшую остановку и рассказать, что такое futures, поскольку resumable функции основаны на том предположении, что std::future будет расширено методом .then(), как это предполагается в документе N3634. future — это результат выполнения асинхронной операции. Это одно из базовых понятий асинхронного программирования. future — это место, где хранится информация о статусе выполнения асинхронной задачи и её результат, если он уже доступен. Вы можете вызывать метод get(), который дождётся завершения асинхронной операции и вернёт вам её результат (это уже реализовано в стандарте), либо зарегистрировать обработчик её завершения через метод .then() (который пока что не в стандарте). Отсутствие .then() в С++11 — одна из наиболее критикуемых ошибок, она наверняка будет исправлена в С++14, вместе с некоторыми другими улучшениями std::future. 

Read more: Habrahabr.ru