C++20 Coroutines What’S Next?

C++20 Coroutines What’S Next?

C++20 Coroutines What’s next? Dawid Pilarski [email protected] blog.panicsoftware.com [email protected] Introduction Who am I? Dawid Pilarski • Senior Software Developer in TomTom • Member of the ISO/JTC1/SC22/WG21 • Member of the PKN KT (programming languages) • C++ blog writer 1 Agenda Quick refresh about the coroutines. Asynchronous RAII P1662R0 RVO for the co_await P1663R0 non tail call optimization P1713R0 2 Questions... Please hold your questions till the end. 3 Quick refresh about the coroutines. What are the coroutines? Subroutine Is a sequence of program instructions that perform a specific task, packaged as a unit. Function Is a subroutine Coroutine Is generalization of the function. 4 • suspended • resumed • created • destroyed What are the coroutines? Function can be: • called • returned from 5 • resumed • created • destroyed What are the coroutines? Coroutine can be: • called • returned from • suspended 5 • created • destroyed What are the coroutines? Coroutine can be: • called • returned from • suspended • resumed 5 • destroyed What are the coroutines? Coroutine can be: • called • returned from • suspended • resumed • created 5 What are the coroutines? Coroutine can be: • called • returned from • suspended • resumed • created • destroyed 5 Coroutine flowchart Function’s flow: Coroutine flow: 6 • Developer must implement what keywords do. • Implementation of promise_type (~6 functions) • Implementation of the co_await keyword (~3 functions) How to implement custom coroutine types. Creating custom coroutine type is not easy: • C++ provides keywords only. 7 • Implementation of promise_type (~6 functions) • Implementation of the co_await keyword (~3 functions) How to implement custom coroutine types. Creating custom coroutine type is not easy: • C++ provides keywords only. • Developer must implement what keywords do. 7 • Implementation of the co_await keyword (~3 functions) How to implement custom coroutine types. Creating custom coroutine type is not easy: • C++ provides keywords only. • Developer must implement what keywords do. This means: • Implementation of promise_type (~6 functions) 7 How to implement custom coroutine types. Creating custom coroutine type is not easy: • C++ provides keywords only. • Developer must implement what keywords do. This means: • Implementation of promise_type (~6 functions) • Implementation of the co_await keyword (~3 functions) 7 How to implement custom coroutine types. Creating custom coroutine type is not easy: • C++ provides keywords only. • Developer must implement what keywords do. This means: • Implementation of promise_type (~6 functions) • Implementation of the co_await keyword (~3 functions) You need to remember to implement on minimum 9 functions. 7 • Compiler knows the function is a coroutine by presence of keywords co_await, co_return, co_yield • If function is a coroutine it’s return type must support coroutines. Coroutine declaration // returned-type name arguments //|-------------| |-------| |--------------| generator<int> fibonacci (int from_value); • Whether the function is a coroutine depends on it’s definition. 8 • If function is a coroutine it’s return type must support coroutines. Coroutine declaration // returned-type name arguments //|-------------| |-------| |--------------| generator<int> fibonacci (int from_value); • Whether the function is a coroutine depends on it’s definition. • Compiler knows the function is a coroutine by presence of keywords co_await, co_return, co_yield 8 Coroutine declaration // returned-type name arguments //|-------------| |-------| |--------------| generator<int> fibonacci (int from_value); • Whether the function is a coroutine depends on it’s definition. • Compiler knows the function is a coroutine by presence of keywords co_await, co_return, co_yield • If function is a coroutine it’s return type must support coroutines. 8 • member of the specialization of the coroutine_traits<returned_type> Promise_type Type supports coroutines if it has promise_type. promise_type can be: • member of the class 9 Promise_type Type supports coroutines if it has promise_type. promise_type can be: • member of the class • member of the specialization of the coroutine_traits<returned_type> 9 • awaitable final_suspend(); • suspension at the end • return_type • how to create get_return_object(); return_type • void unhandled_exception(); • handling unhandled exception Promise_type Promise_type controls coroutine’s behavior. • awaitable initial_suspend(); • suspension at the beginning 10 • return_type • how to create get_return_object(); return_type • void unhandled_exception(); • handling unhandled exception Promise_type Promise_type controls coroutine’s behavior. • awaitable initial_suspend(); • suspension at the beginning • awaitable final_suspend(); • suspension at the end 10 • void unhandled_exception(); • handling unhandled exception Promise_type Promise_type controls coroutine’s behavior. • awaitable initial_suspend(); • suspension at the beginning • awaitable final_suspend(); • suspension at the end • return_type • how to create get_return_object(); return_type 10 Promise_type Promise_type controls coroutine’s behavior. • awaitable initial_suspend(); • suspension at the beginning • awaitable final_suspend(); • suspension at the end • return_type • how to create get_return_object(); return_type • void unhandled_exception(); • handling unhandled exception 10 • co_return; • p.return_void(); • co_yield V; • co_await p.yield_value(); Keywords and promise_type Promise_type is also responsible for keyword’s actions: • co_return V; • p.return_value(V); 11 • co_yield V; • co_await p.yield_value(); Keywords and promise_type Promise_type is also responsible for keyword’s actions: • co_return V; • p.return_value(V); • co_return; • p.return_void(); 11 Keywords and promise_type Promise_type is also responsible for keyword’s actions: • co_return V; • p.return_value(V); • co_return; • p.return_void(); • co_yield V; • co_await p.yield_value(); 11 • void • bool • another coroutine_handle • bool await_ready() • await_suspend(coroutine_handle<P>) returning • T await_resume() • have awaiter operator co_await defined, or • have global awaiter operator co_await(A) support, or • implement 3 functions (be awaiter itself): co_await In order to support co_await expressions, the argument (awaitable): • promise_type.await_transform(A) (if exists) must produce object which type has below properties: 12 • void • bool • another coroutine_handle • bool await_ready() • await_suspend(coroutine_handle<P>) returning • T await_resume() • have global awaiter operator co_await(A) support, or • implement 3 functions (be awaiter itself): co_await In order to support co_await expressions, the argument (awaitable): • promise_type.await_transform(A) (if exists) must produce object which type has below properties: • have awaiter operator co_await defined, or 12 • void • bool • another coroutine_handle • bool await_ready() • await_suspend(coroutine_handle<P>) returning • T await_resume() • implement 3 functions (be awaiter itself): co_await In order to support co_await expressions, the argument (awaitable): • promise_type.await_transform(A) (if exists) must produce object which type has below properties: • have awaiter operator co_await defined, or • have global awaiter operator co_await(A) support, or 12 • void • bool • another coroutine_handle • bool await_ready() • await_suspend(coroutine_handle<P>) returning • T await_resume() co_await In order to support co_await expressions, the argument (awaitable): • promise_type.await_transform(A) (if exists) must produce object which type has below properties: • have awaiter operator co_await defined, or • have global awaiter operator co_await(A) support, or • implement 3 functions (be awaiter itself): 12 • void • bool • another coroutine_handle • await_suspend(coroutine_handle<P>) returning • T await_resume() co_await In order to support co_await expressions, the argument (awaitable): • promise_type.await_transform(A) (if exists) must produce object which type has below properties: • have awaiter operator co_await defined, or • have global awaiter operator co_await(A) support, or • implement 3 functions (be awaiter itself): • bool await_ready() 12 • void • bool • another coroutine_handle • T await_resume() co_await In order to support co_await expressions, the argument (awaitable): • promise_type.await_transform(A) (if exists) must produce object which type has below properties: • have awaiter operator co_await defined, or • have global awaiter operator co_await(A) support, or • implement 3 functions (be awaiter itself): • bool await_ready() • await_suspend(coroutine_handle<P>) returning 12 • bool • another coroutine_handle • T await_resume() co_await In order to support co_await expressions, the argument (awaitable): • promise_type.await_transform(A) (if exists) must produce object which type has below properties: • have awaiter operator co_await defined, or • have global awaiter operator co_await(A) support, or • implement 3 functions (be awaiter itself): • bool await_ready() • await_suspend(coroutine_handle<P>) returning • void 12 • another coroutine_handle • T await_resume() co_await In order to support co_await expressions, the argument (awaitable): • promise_type.await_transform(A) (if exists) must produce object which type has below properties: • have awaiter operator co_await defined, or • have global awaiter operator co_await(A) support, or • implement 3 functions (be awaiter itself): • bool await_ready() • await_suspend(coroutine_handle<P>)

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    175 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us