Корутиналар (C++20)
Токтой алган, ордун эстеп калган жана кийин уланта алган функциялар
co_await, co_yield, co_return — алар кадимки көрүнгөн функцияны ушундай токтотула турган абал машинасына айландырат. Ушул бир мүмкүнчүлүк эки таптакыр башка куралдын негизинде жатат: жалкоо генераторлор (маанилерди суроо боюнча бирден чыгарат) жана колбэксиз асинхрондук код (агымды бөгөттөбөгөн, await стилиндеги ырааттуу код жазабыз).
- функцияны корутина кылган нерсени жана үч
co_ачкыч сөзүнүн эмне кыларын так айтууга; - корутина кадрын,
promise_typeжанаcoroutine_handleтүшүндүрүүгө; co_yieldаркылуу маанилерди жалкоо чыгарган өз колуңуз менен жазылганGeneratorокууга;co_awaitколбэк чынжырларын түз ырааттуу асинхрондук код менен алмаштырганын көрүүгө;- чынчыл сооданы атоого: үймөктөгү кадрлар, C++20до аз китепкана колдоосу жана өмүр убактысынын капкандары.
1. Функцияны корутина кылган нерсе
Корутинаны кол коюуда өзгөчө ачкыч сөз менен жарыялашпайт. Функция денеси төмөнкү үч ачкыч сөздүн жок дегенде бирин колдонсо, ал корутина болуп калат:
co_await expr— expr даяр болгонго чейин токтоп, анан улантуу (жана каалоо боюнча натыйжа алуу).co_yield value— чакыруучу кодго бир маани берип, токтоо;co_await promise.yield_value(value)дегенге барабар.co_return value— корутинаны бүтүрүү, каалоо боюнча акыркы натыйжаны берүү.
Компилятор мындай функцияны абал машинасына кайра жазат. Башкаруу денеден чыгып, кайра кире алгандыктан, жергиликтүү өзгөрмөлөр кадимки чакыруу стегинде жашай албайт (токтогон учурда стек кадры жоголот). Анын ордуна алар корутина кадрында жашайт: адатта үймөктө жайгашкан эстутум блогу, мында параметрлер, жергиликтүү өзгөрмөлөр жана promise деп аталган кичине кызматтык объект сакталат.
promise_type дегени std::promise/std::future менен эч кандай байланышы жок. Бул компилятор сүйлөшкөн ыңгайлаштыруу чекити; сиз аны түз дээрлик колдонбойсуз — аны китепкана тиби берет.