{"id":105178,"date":"2021-05-04T07:00:01","date_gmt":"2021-05-04T14:00:01","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/oldnewthing\/?p=105178"},"modified":"2023-07-20T06:36:26","modified_gmt":"2023-07-20T13:36:26","slug":"20210504-01","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210504-01\/?p=105178","title":{"rendered":"A map through the three major coroutine series"},"content":{"rendered":"<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Inauguration_of_Gerald_Ford#Remarks_upon_swearing-in\"> Our long national nightmare is not yet over<\/a>: The three main coroutine series are now done, although that doesn&#8217;t mean I&#8217;m done with coroutines.<\/p>\n<p>Here&#8217;s a map through the main series, at least. There is a direct route and a number of scenic routes.<\/p>\n<h2>Part the First: Awaitable Objects<\/h2>\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n<tbody>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\">Start the first part<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20191209-00\/?p=103195\"> C++ coroutines: Getting started with awaitable objects<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"2\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20191210-00\/?p=103197\"> C++ coroutines: Constructible awaitable or function returning awaitable?<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"2\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20191211-00\/?p=103201\"> C++ coroutines: Framework interop<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"2\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20191212-00\/?p=103207\"> C++ coroutines: Awaiting an IAsyncAction without preserving thread context<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20191213-00\/?p=103210\"> C++ coroutines: Short-circuiting suspension, part 1<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20191216-00\/?p=103217\"> C++ coroutines: Short-circuiting suspension, part 2<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"2\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20191217-00\/?p=103219\"> C++ coroutines: no callable &#8216;await_resume&#8217; function found for type<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20191218-00\/?p=103221\"> C++ coroutines: Defining the co_await operator<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"2\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20191219-00\/?p=103230\"> C++ coroutines: The co_await operator and the function search algorithm<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"2\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20191220-00\/?p=103232\"> C++ coroutines: The problem of the synchronous apartment-changing callback<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"2\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20191223-00\/?p=103255\"> C++ coroutines: The problem of the DispatcherQueue task that runs too soon, part 1<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"2\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20191224-00\/?p=103262\"> C++ coroutines: The problem of the DispatcherQueue task that runs too soon, part 2<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"2\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20191225-00\/?p=103265\"> C++ coroutines: The problem of the DispatcherQueue task that runs too soon, part 3<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"2\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20191226-00\/?p=103268\"> C++ coroutines: The problem of the DispatcherQueue task that runs too soon, part 4<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\">You made it to the end of the first part<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Part the Second: Awaitable Signals<\/h2>\n<p>The early portions are optional, but things get interesting toward the end of the second part, where we build a &#8220;result holder&#8221;.<\/p>\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n<tbody>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"6\">Start the second part<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210301-00\/?p=104914\"> Creating a <code>co_await<\/code> awaitable signal that can be awaited multiple times, part 1<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210302-00\/?p=104918\"> Creating a <code>co_await<\/code> awaitable signal that can be awaited multiple times, part 2<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210303-00\/?p=104922\"> Creating a <code>co_await<\/code> awaitable signal that can be awaited multiple times, part 3<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210304-00\/?p=104926\"> Creating a <code>co_await<\/code> awaitable signal that can be awaited multiple times, part 4<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210305-00\/?p=104934\"> Creating a <code>co_await<\/code> awaitable signal that can be awaited multiple times, part 5<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210308-00\/?p=104938\"> Creating a <code>co_await<\/code> awaitable signal that can be awaited multiple times, part 6<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"2\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210309-00\/?p=104942\"> Creating other types of synchronization objects that can be used with <code>co_await<\/code>, part 1: The one-shot event<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"2\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210310-00\/?p=104945\"> Creating other types of synchronization objects that can be used with <code>co_await<\/code>, part 2: The basic library<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"2\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210311-00\/?p=104949\"> Creating other types of synchronization objects that can be used with <code>co_await<\/code>, part 3: Parallel resumption<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"2\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210312-00\/?p=104955\"> Creating other types of synchronization objects that can be used with <code>co_await<\/code>, part 4: The manual-reset event<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"2\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210315-00\/?p=104964\"> Creating other types of synchronization objects that can be used with <code>co_await<\/code>, part 5: The auto-reset event<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"2\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210316-00\/?p=104971\"> Creating other types of synchronization objects that can be used with <code>co_await<\/code>, part 6: The semaphore<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"2\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210317-00\/?p=104973\"> Creating other types of synchronization objects that can be used with <code>co_await<\/code>, part 7: The mutex and recursive mutex<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"2\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210318-00\/?p=104977\"> Creating other types of synchronization objects that can be used with <code>co_await<\/code>, part 8: The shared mutex<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"2\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210319-00\/?p=104979\"> Creating other types of synchronization objects that can be used with <code>co_await<\/code>, part 9: The shared mutex (continued)<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"2\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210322-00\/?p=104981\"> Creating other types of synchronization objects that can be used with <code>co_await<\/code>, part 10: Wait for an event to clear<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"6\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210323-00\/?p=104987\"> Creating a task completion source for a C++ coroutine: Producing a result<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"6\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210324-00\/?p=104995\"> Creating a task completion source for a C++ coroutine: Producing a result with references<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"6\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210325-00\/?p=105002\"> Creating a task completion source for a C++ coroutine: Producing nothing<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"6\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210326-00\/?p=105009\"> Creating a task completion source for a C++ coroutine: Failing to produce a result<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"6\">You made it to the end of the second part<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Part the Third: Coroutine Promises<\/h2>\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"3\">\n<tbody>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\">Start the third part<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210329-00\/?p=105015\"> C++ coroutines: The mental model for coroutine promises<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210330-00\/?p=105019\"> C++ coroutines: Basic implementation of a promise type<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210331-00\/?p=105028\"> C++ coroutines: The initial and final suspend, and improving our return_value method<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"2\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210401-00\/?p=105043\"> C++ coroutines: What happens if an exception occurs in my <code>return_value<\/code>?<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210402-00\/?p=105047\"> C++ coroutines: Making the promise itself be the shared state, the inspiration<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210405-00\/?p=105054\"> C++ coroutines: Making the promise itself be the shared state, the outline<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210406-00\/?p=105057\"> C++ coroutines: Building a result holder for movable types<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210407-00\/?p=105061\"> C++ coroutines: Accepting types via <code>return_void<\/code> and <code>return_value<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210408-00\/?p=105063\"> C++ coroutines: Awaiting the <code>simple_task<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210409-00\/?p=105065\"> C++ coroutines: Managing the reference count of the coroutine state<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"2\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210412-00\/?p=105078\"> C++ coroutines: The lifetime of objects involved in the coroutine function<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"2\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210413-00\/?p=105093\"> C++ coroutines: Tradeoffs of making the promise be the shared state<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210414-00\/?p=105095\"> C++ coroutines: Making it impossible to <code>co_await<\/code> a task twice<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210415-00\/?p=105109\"> C++ coroutines: Getting rid of our mutex<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210416-00\/?p=105115\"> C++ coroutines: Getting rid of our reference count<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"2\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210419-00\/?p=105119\"> C++ coroutines: Allowing the awaiter to be destroyed while suspended<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"2\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210420-28\/?p=105128\"> C++ coroutines: Getting rid of our atomic variant discriminator<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"2\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210421-00\/?p=105135\"> C++ coroutines: Cold-start coroutines<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"2\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210422-00\/?p=105139\"> C++ coroutines: Improving cold-start coroutines which complete synchronously<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"2\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210423-00\/?p=105146\"> C++ coroutines: Associating multiple tasks with the same promise<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210426-00\/?p=105153\"> C++ coroutines: What does it mean when I declare my coroutine as noexcept?<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210427-00\/?p=105157\"> C++ coroutines: How do I create a coroutine that terminates on an unhandled exception?<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210428-00\/?p=105160\"> C++ coroutines: Snooping in on the coroutine body<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210429-00\/?p=105165\"> C++ coroutines: Adding custom resume context support to our awaiter<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"2\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210430-00\/?p=105171\"> C++ coroutines: Waiting synchronously for our coroutine to complete<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"2\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210503-00\/?p=105173\"> C++ coroutines: Converting among tasks that use the same promise<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\"><a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210504-00\/?p=105176\"> C++ coroutines: Promise constructors<\/a><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 1em; height: 1em; border-right: solid 1px currentcolor;\">\u00a0<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td style=\"border: solid 1px currentcolor;\" colspan=\"4\">You are here<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>I&#8217;m not done with coroutines, but this is a road map through the three main areas.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>For your casual reading convenience.<\/p>\n","protected":false},"author":1069,"featured_media":111744,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[25],"class_list":["post-105178","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oldnewthing","tag-code"],"acf":[],"blog_post_summary":"<p>For your casual reading convenience.<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/posts\/105178","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/users\/1069"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/comments?post=105178"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/posts\/105178\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/media\/111744"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/media?parent=105178"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/categories?post=105178"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/oldnewthing\/wp-json\/wp\/v2\/tags?post=105178"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}