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

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

Async, future жана promise

Параллель иштен натыйжаны жана өзгөчө кырдаалды кантип алуу керек

Негизги идея: Кадимки std::thread иш аткара алат, бирок эч нерсе кайтарбайт, ал эми ыргытылган ар кандай өзгөчө кырдаал (exception) программаны кыйратат. Futures китепканасы бир багыттуу каналды - жалпы абалды (shared state) кошот: өндүрүүчү бир маалда ага маани (же өзгөчө кырдаал) жазат, ал эми колдонуучу ошол маанини std::future аркылуу окуйт да, натыйжа чын эле керек болгондо гана бөгөттөлөт. Ошентип иштин башталышы анын натыйжасын жыйноодон ажыратылат.
Аягында сиз мына буларды жасай аласыз:
  • std::async аркылуу тапшырманы иштетип, анын натыйжасын std::future аркылуу окуу,
  • launch::async менен launch::deferred ортосунда аңдап тандоо,
  • std::promise аркылуу өндүрүүчү менен колдонуучуну кол менен туташтыруу, өзгөчө кырдаалдарды кошуп,
  • ар кандай чакырылуучу объектти агым пулу үчүн std::packaged_task-ка ороо,
  • классикалык тузактардан качуу: бөгөттөөчү ~future, бир жолку get() жана унчукпай кийинкиге калтыруу.

1. Эмне үчүн жөн эле агымдар жетишсиз

Сиз std::thread менен көп агымдуулуктун негиздеринен тааныш болушуңуз керек. Агымдын өзү үчүн чакырылуучу объект void кайтарат: маани кайтаруунун орнотулган жолу жок, ал эми тапшырма өзгөчө кырдаал ыргытса, ал агымдын чегарасын кесип өтө албайт, ошондуктан аткаруу чөйрөсү std::terminate чакырат. Натыйжаны кол менен кайтаруу үчүн жалпы өзгөрмө плюс "даяр" деп сигнал берүү үчүн std::mutex жана std::condition_variable керек болмок - "муну аткарып, мага жоопту бер" деген кадимки нерсе үчүн көп морт түтүк.

<future> башкы файлы так ушул түтүктү таза интерфейстин артына жашырат. Бир жашыруун жалпы абалдын үстүндө үч кызматташкан бөлүк жатат:

  • std::future<T> - окуучу учу. Бирөө убакыт өткөндөн кийин бул жерге T (же өзгөчө кырдаал) коёт; get() аны алат, даяр болгонго чейин бөгөттөйт.
  • std::promise<T> - кол менен жазуучу учу, аны сиз set_value же set_exception аркылуу өзүңүз толтурасыз.
  • std::async / std::packaged_task - ыңгайлуу өндүрүүчүлөр: алар чакырылуучу объекттен жазуучу учун түзүп, аны автоматтык түрдө кайтарылуучу маани менен толтурат.
Жалпы абал - натыйжа-же-өзгөчө кырдаалды, "даяр" желекчесин жана синхрондоштурууну сактаган үймөктөгү кичине блок. Жазуучу жана окуучу учтары ага шилтемени кармашат - концептуалдык жактан shared_ptr артындагы башкаруу блогуна абдан окшош.

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

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

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

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