[HN Gopher] A Mental Model for C++ Coroutine
       ___________________________________________________________________
        
       A Mental Model for C++ Coroutine
        
       Author : uvdn7
       Score  : 28 points
       Date   : 2025-07-11 17:23 UTC (2 days ago)
        
 (HTM) web link (uvdn7.github.io)
 (TXT) w3m dump (uvdn7.github.io)
        
       | mog_dev wrote:
       | Interesting article, but you should use a spell checker. Typos
       | are distracting.
        
         | uvdn7 wrote:
         | I am not a native speaker and I joke about my typos and grammar
         | mistakes being the evidence that none of my code or post is AI
         | generated. Sorry about the typos. I just fixed all the ones I
         | can find. Hope it's better now.
        
           | valorzard wrote:
           | i appreciate that you don't use AI. I like real human stuff
        
       | valorzard wrote:
       | Note that with std::execution, c++26 will have a default async
       | runtime (similar to how C# has a default async runtime).
       | 
       | This means that c++26 is getting a default coroutine task type
       | [1] AND a default executor [2]. You can even spawn the tasks like
       | in Tokio/async Rust. [3]
       | 
       | I'm not totally sure if this is a GOOD idea to add to the c++
       | standard but oh well.
       | 
       | [1] https://www.open-
       | std.org/jtc1/sc22/wg21/docs/papers/2025/p35...
       | 
       | [2] http://wg21.link/P2079R5
       | 
       | [3] https://www.open-
       | std.org/jtc1/sc22/wg21/docs/papers/2025/p31...
        
         | uvdn7 wrote:
         | > I'm not totally sure if this is a GOOD idea to add to the c++
         | standard
         | 
         | What are the downsides? Naively, it seems like a good idea to
         | both provide a coroutine spec (for power users) and a default
         | task type & default executor.
        
           | valorzard wrote:
           | well, Rust didn't do the same thing for a reason. Rust lets
           | you pick and choose what async runtime to use (even though
           | everyone has decided to use Tokio anyways). This is good
           | because it allows for alternative async runtimes like Embassy
           | (https://embassy.dev/) and it also doesn't freeze the API
           | into something that can't change. It could totally be
           | possible that people find a new style of async that works
           | better than std::execution.
        
             | Rohansi wrote:
             | I don't know how it works for C++ but you're not locked
             | down to a single implementation with how C# does it. You
             | can have it use different executors/schedulers, different
             | task types, etc.
        
               | uvdn7 wrote:
               | You are also not locked down in C++. There are already a
               | handful of coroutine and async runtime implementations
               | out there.
        
       | a_t48 wrote:
       | I'm excited to actually getting around to trying coroutines -
       | they should be a good replacement for simple state machines.
       | Rather than an storing an object with a state enum, I can write
       | simple declarative code.
        
         | spacechild1 wrote:
         | In my latest personal project I have switched my asio
         | networking code from callback functions to coroutines. It is
         | such a big improvement! Repeated actions can be written as
         | simple loops, error handling is done with exceptions and the
         | code is generally much easier to follow. And here's the icing
         | on the cake: most data can actually stay in local variables,
         | which means I don't have to care about the lifetime!
        
       | nickelpro wrote:
       | Random switching between "Awaitor" and "awaiter" makes it seem
       | like these are distinct concepts instead that the reader is
       | supposed to understand.
       | 
       | In general this moves way too fast for the density of the grammar
       | it's trying to introduce, lines like:
       | 
       | > We have seen Awaitors already - suspend_always is an empty
       | awaiter type that has await_ready returns false always.
       | 
       | But we haven't "seen" suspend_always, it's mentioned in half a
       | sentence in an earlier paragraph, with no further context or
       | examples.
       | 
       | There's a reason Lewis Baker's writings about C++ coroutines are
       | 5000 word monsters, the body of grammar which needs to be covered
       | demands that level of careful and precise definition and
       | exploration.
        
         | michaelg7x wrote:
         | Amen. Even with those 5k word monsters it's brutally hard.
         | Andreas Fertig's cpp-insights is really helpful, when is able
         | to complete the coroutine transform.
         | 
         | FWIW, I think a useful addition would be for compilers to
         | output the intermediate source code, so you can reason more
         | easily about behaviour and debug into readable code.
        
       | gpderetta wrote:
       | I recently decided that it was time to properly learn C++
       | coroutines. I looked at a few tutorials, but by far the best was
       | Raymond Chen coroutine series[1]. It is a long series, but every
       | article is just the right size. Strongly recommended.
       | 
       | [1]
       | https://devblogs.microsoft.com/oldnewthing/20210504-01/?p=10...
        
       ___________________________________________________________________
       (page generated 2025-07-13 23:01 UTC)