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 артындагы башкаруу блогуна абдан окшош.