Мазмунга өтүү

Сабактын башталышы

Корутиналар (C++20)

Токтой алган, ордун эстеп калган жана кийин уланта алган функциялар

Негизги идея: Кадимки функция үстүнөн ылдый аткарылып, так бир жолу маани кайтарат. Корутина ортосунда өзүн токтото алат, башкарууну аны чакырган кодго кайтарып берет жана кийин так токтогон жеринен уланат, ошондо анын бардык жергиликтүү өзгөрмөлөрү сакталып калат. 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 менен эч кандай байланышы жок. Бул компилятор сүйлөшкөн ыңгайлаштыруу чекити; сиз аны түз дээрлик колдонбойсуз — аны китепкана тиби берет.

Бул сабакты YourAIZone платформасында улантыңыз

Толук сабакта — толук түшүндүрмө, чыгарылган мисалдар, көп кездешкен каталар, заматта текшерилүүчү тесттер жана ЖИ-репетитор. Конок катары дароо баштаңыз же прогрессти сактоо үчүн аккаунт түзүңүз.

Толук сабакта

  • Толук түшүндүрмө
  • Чыгарылган мисалдар
  • Көп кездешкен каталар жана алардан кантип качуу керек
  • Тест суроолору: 15
  • Тема боюнча суроолорго жооп берген ЖИ-репетитор
  • Окуучу, ата-эне жана мугалим үчүн прогрессти көзөмөлдөө