C ++ 20-да қандай сопрограммалар бар?

дегі корутиналар дегеніміз не?

«Parallelism2» және / немесе «Concurrency2» (төмендегі суретті қараңыз) қалай ерекшеленеді?

ISOCPP төменгі суреті.

https://isocpp.org/files/img/wg21-timeline-2017-03.png

2019

19 апр. 19 сәуірде Naidu орнатқан 2017-04-19 21:39 '17 в 21:39 2017-04-19 21:39
@ 3 жауаптар

Абстракция деңгейінде, Coroutines атқару ағыны идеясынан орындау жағдайына ие болу идеясын бөлді.

SIMD (бір пәрмен, бірнеше деректер) бірнеше орындау ағындары бар, бірақ орындалудың бір ғана күйі (тек бірнеше деректермен жұмыс істейді). Мүмкін параллельді алгоритмдер әртүрлі деректермен жұмыс істейтін «бағдарлама» бар сияқты.

Тақырыптар бірнеше «орындалу жиектері» және бірнеше орындалу күйі бар. Сізде бірнеше бағдарлама және бірнеше орындалатын жіп бар.

Сорутинаның бірнеше орындалу күйі бар, бірақ орындалу ағынына ие емес. Сізде бағдарлама бар және бағдарлама күйі бар, бірақ ол орындалу ағыны жоқ.


Қосындылардың қарапайым мысалы - генераторлар немесе басқа тілдерден алынған элементтер.

Псевдокодта:

 function Generator() { for (i = 0 to 100) produce i } 

Generator шақырылады, ал бірінші қоңырауда 0 қайтарады. Оның күйі есте қалады (мемлекетке корутинаның енгізілуіне байланысты өзгереді), ал келесі жолы оны атаған кезде ол тоқтаған жерде жалғасады. Сондықтан келесі жолы 1 қайтарады. Содан кейін 2.

Соңында, циклдің соңына жетеді және функцияның соңынан түседі; корутин аяқталды. (Мұнда не болып жатқанын біз айтып отырған тілге тәуелді, бұл питонда бұл ерекше жағдай туғызады).

Couture бұл функцияны C ++-ке береді.

Қоспаның екі түрі бар; стек және стек жоқ.

Диаграмма жоқ күйде оның жай-күйі мен орындалатын жерінде жергілікті айнымалы мәндер сақталады.

Стек корпусы бүкіл жинақты сақтайды (мысалы, жіп).

Соққылардың өте жеңіл болуы мүмкін. Мен оқып отырған соңғы сөз негізінен функцияңызды ламбда сияқты қайта жазу туралы; барлық жергілікті айнымалы мәндер объектінің күйіне ауысады, ал жапсырмалар аралық нәтижелерді «береді» деген жерге бару үшін қолданылады.

Мән құру үдерісі «кірістілік» деп аталады, себебі сопутиялар кооперативті многопоточкаға ұқсас; Сіз орындау орнын қоңырау шалушыға қайтарасыз.

Boost стек сутегінің енгізілуіне ие; Бұл сіз үшін функцияны шақыруға мүмкіндік береді. Айнымалы корутиналар әлдеқайда күшті, бірақ қымбат.


Қарапайым генераторға қарағанда, құрамалар көп. Сіз корутинді пайдалы түрде қолдануға мүмкіндік беретін корутинмен күте аласыз.

Егер, мысалы, циклдар және функционалдық қоңыраулар сияқты сорутиналар, белгілі бір пайдалы үлгілерді (мысалы, соңғы автоматтар) білдіруге мүмкіндік беретін тағы бір «құрылымдалған өтпелі» түрі болып табылады.


C ++-дегі корутиналардың нақты енгізілуі біршама қызықты.

Ең негізгі деңгейде C ++: co_return co_await co_yield , сондай-ақ олармен жұмыс істейтін кітапханалардың кейбір түрлері үшін бірнеше түйінді сөздерді қосады.

Функциясы корутинге айналады, олардың біреуі өз денесінде. Осылайша, олардың хабарландыруларынан олар функциялардан айырмашылығы жоқ.

Осы үш кілт сөздің біреуі функцияның денесінде қолданылған кезде, қайтару түрі мен дәлелдердің кейбір стандартты міндетті сараптамасы орын алады және функция сопрограммаға айналады. Бұл зерттеу функциясы тоқтаған кезде функцияның жағдайын сақтауға арналған компиляторға нұсқайды.

Ең қарапайым корутин - бұл генератор:

 generator<int> get_integers( int start=0, int step=1 ) { for (int current=start; current+= step) co_yield current; } 

co_yield функцияларды орындауды тоқтатады, осы күйді generator<int> сақтайды, содан кейін current мәнді generator<int> арқылы қайтарады.

Қайтарылған бүтін сандардың үстінен қайталануы мүмкін.

co_await біреуін біреуіне қосуға мүмкіндік береді. Егер сіз біреудің ішінде болсаңыз және сізге күтілетін нәрселердің нәтижесі (жиі co_await ) қажет болса, сіз прогресті алдын-ала қарастырмасаңыз, оны пайдалануыңызға болады. Егер олар дайын болса, сіз дереу жалғастырасыз; егер болмаса, сіз күткен күтуге дайын болғанша жұмысты тоқтата аласыз.

 std::future<std::expected<std::string>> load_data( std::string resource ) { auto handle = co_await open_resouce(resource); while( auto line = co_await read_line(handle)) { if (std::optional<std::string> r = parse_data_from_line( line )) co_return *r; } co_return std::unexpected( resource_lacks_data(resource) ); } 

load_data - бұл аталмыш ресурс ашық болғанда std::future жасайтын load_data , және біз сұралған деректерді тапқан нүктені талдауға мүмкіндік береміз.

open_resource және read_line файлды ашатын және одан сызықтарды оқитын асинхронды read_line болуы мүмкін. co_await дың жай-күйі мен дайындығы жай- co_await байланысады.

C ++ корутниктері олардан әлдеқайда икемді, себебі олар пайдаланушы кеңістігінің түрлеріне арналған тіл функцияларының ең аз жиынтығы ретінде енгізілген. Пайдаланушы кеңістіктерінің түрлері co_return co_await және co_yield co_return тиімді түрде анықтайды - Мен адамдар мұны co_await емес co_await іске асыру үшін қолданғанын көрдім, осылайша, бос емес қосымша параметр үшін co_await автоматты түрде бос күйді сыртқы емес co_await таратады:

 modified_optional<int> add( modified_optional<int> a, modified_optional<int> b ) { return (co_await a) + (co_await b); } 

орнына

 std::optional<int> add( std::optional<int> a, std::optional<int> b ) { if (!a) return std::nullopt; if (!b) return std::nullopt; return *a + *b; } 
69
29 мая '17 в 17:05 2017-05-29 17:05 жауапты Якк - Адам Невраумонт 29 мамыр, 17: 05-да 2017-05-29 17:05

Корутин C функциясына ұқсайды, ол бірнеше қайтару мәлімдемесі бар және екінші рет шақырылған кезде функцияның басында орындауды бастамайды, бірақ алдыңғы қайтарудан кейін бірінші пәрменде болады. Бұл орындалу орыны пішімсіз емес функциялардың стекінде тұратын барлық автоматты айнымалылармен бірге сақталады.

border=0

Майкрософт корпорациясының бұрынғы экспериментальды қолданылуы копирленген стектерді пайдаланып, терең кірістірілген функциялардан оралуға мүмкіндік берді. Бірақ бұл нұсқа C ++ комитеті тарапынан қабылданбады. Сіз бұл іске асыруға, мысалы, Boosts талшықты кітапханасына қол жеткізе аласыз.

7
04 нояб. жауап Lothar 04 қараша. 2017-11-04 04:39 '17 at 4:39 2017-11-04 04:39

Қосымдықтар басқа (C ++) функцияларда болуы мүмкін басқа да процедуралар үшін «күте» алатын және кідіртілген, кідіртілген, күтуге болатын, кіші бағдарлама үшін қажет нәрсенің бәрін қамтамасыз етуі керек деп есептеледі. C ++ адамдар үшін ең қызықты болатын функция, бұл сопротезы стака кеңістігін ең жақсы иеленбейді ... C # күту және бару сияқты қазірдің өзінде осындай нәрсе жасай алады, бірақ C ++ қайта құру қажет болуы мүмкін, оны алу үшін.

келісу көбінесе проблема бағдарламаның аяқталуы керек тапсырмамен байланысты болғанда проблемаларды бөлуге бағытталған. бұл мәселелерді бөлуге бірнеше құралдар арқылы қол жеткізуге болады ... әдетте бұл бір делегация. Параллельділік идеясы мынада, бірқатар процестерді дербес жүзеге асыруға болады (проблемаларды бөлу) және «тыңдаушы» бұл жеке мәселелермен туындаған барлық нәрселерді қайда баруға бағыттайды. бұл асинхронды бақылаудың қандай да бір түріне байланысты. Параллельділікке, соның ішінде аспектке бағдарланған бағдарламалауға және басқаларға бірқатар тәсілдер бар. C # өкілі бар, ол жақсы жұмыс істейді.

параллелизм параллельділік сияқты бірдейлікпен әрекет етеді және қатыса алады, бірақ іс жүзінде бұл бағдарламалық жасақтамамен қатар, бірнеше бөлек процессорлар қатысуымен физикалық конструкция болып табылады, ол кодын бөліктерін басқа процессорларға жібере алады, ол іске қосылады және нәтижелер синхронды түрде алынады.

1
19 апр. жауап 19 сәуірде Dr t ұсынған 2017-04-19 21:55 '17 at 9:55 2017-04-19 21:55