{"id":7361,"date":"2015-11-30T08:51:00","date_gmt":"2015-11-30T08:51:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/vcblog\/2015\/11\/30\/coroutines-in-visual-studio-2015-update-1\/"},"modified":"2019-02-18T18:04:55","modified_gmt":"2019-02-18T18:04:55","slug":"coroutines-in-visual-studio-2015-update-1","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/cppblog\/coroutines-in-visual-studio-2015-update-1\/","title":{"rendered":"Coroutines in Visual Studio 2015 &#8211; Update 1"},"content":{"rendered":"<p>In preview of Visual Studio 2015, we introduced Coroutines for C++, see these <a href=\"http:\/\/blogs.msdn.com\/b\/vcblog\/archive\/2014\/11\/12\/resumable-functions-in-c.aspx\">blog post<\/a> for an introduction and <a href=\"http:\/\/blogs.msdn.com\/b\/vcblog\/archive\/2015\/04\/29\/more-about-resumable-functions-in-c.aspx\">here<\/a>.     <br \/>You can also look at the CPPCon 2015 talk about C++ Coroutines <a href=\"https:\/\/www.youtube.com\/watch?v=_fu0gx-xseY\">here<\/a>. <\/p>\n<p>We continue to work on resumable functions, here it is a brief update on coroutines status in VS 2015 Update 1. See the Visual Studio 2015 Update1 post <a href=\"http:\/\/blogs.msdn.com\/b\/visualstudio\/archive\/2015\/11\/30\/visual-studio-update-1-rtm.aspx\">here<\/a>.<\/p>\n<h4>Some limitations are gone:<\/h4>\n<ul>\n<li>Now supported on ARM, x86 and amd64 <\/li>\n<li>Now you can use exceptions in a coroutine <\/li>\n<li>Now you can use return statement before await or yield in a coroutine <\/li>\n<li>Now you can use coroutines with \/ZI (Edit and Continue Debugging) <\/li>\n<\/ul>\n<h4>Some stayed:<\/h4>\n<ul>\n<li>Still not compatible with \/sdl and \/RTCx flags (should fix in VS Update 2) <\/li>\n<li>We will give incorrect \/W4 warnings about variables being unused or uninitialized in the coroutines <\/li>\n<\/ul>\n<h4>Design changes tracking the latest coroutine proposal (P0057):<\/h4>\n<ul>\n<li>Initial_suspend\/final_suspend\/yield_value must return awaitable <\/li>\n<li>Allocation customization is done by overloading operator new of the promise rather than providing an allocator object <\/li>\n<li>Await customization via operator await <\/li>\n<li>yield is now expression, not a statement <\/li>\n<li>(see P0054 for more details) <\/li>\n<\/ul>\n<h4>What to expect in VS Update 2<\/h4>\n<ul>\n<li>Removal of the limitations <\/li>\n<li>Adding coroutine specific optimizations <\/li>\n<li>await_transform customizaiton point (see P0054) <\/li>\n<li>Adding the Kona 2015 keywords: co_await, co_yield and co_return. <\/li>\n<\/ul>\n<h4>References<\/h4>\n<ul>\n<li>P0054: <a href=\"http:\/\/www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2015\/p0054r0.html\">http:\/\/www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2015\/p0054r0.html<\/a>       <br \/>P0057: <a href=\"http:\/\/www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2015\/p0057r0.pdf\">http:\/\/www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2015\/p0057r0.pdf<\/a>       <br \/>CppCon Coroutine talk: <a href=\"https:\/\/www.youtube.com\/watch?v=_fu0gx-xseY\">https:\/\/www.youtube.com\/watch?v=_fu0gx-xseY<\/a> <\/li>\n<\/ul>\n<h4>Bonus<\/h4>\n<p>Use operator await to define how to await on std::chrono::duration that goes straight to Win32 threadpool APIs.<\/p>\n<p>&nbsp;<\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><font face=\"Consolas\"><span style=\"font-family:;color:\"><font color=\"#0000ff\"><font style=\"font-size: 9.5pt\">#include<\/font><\/font><\/span><font style=\"font-size: 9.5pt\"><span style=\"font-family:;color:\"><font color=\"#000000\"> <\/font><\/span><\/font><span style=\"font-family:;color:\"><font style=\"font-size: 9.5pt\" color=\"#a31515\">&lt;windows.h&gt;<\/font><\/span><\/font><span style=\"font-family:;color:\"><\/span><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><font face=\"Consolas\"><span style=\"font-family:;color:\"><font color=\"#0000ff\"><font style=\"font-size: 9.5pt\">#include<\/font><\/font><\/span><font style=\"font-size: 9.5pt\"><span style=\"font-family:;color:\"><font color=\"#000000\"> <\/font><\/span><\/font><span style=\"font-family:;color:\"><font style=\"font-size: 9.5pt\" color=\"#a31515\">&lt;future&gt;<\/font><\/span><\/font><span style=\"font-family:;color:\"><\/span><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><font face=\"Consolas\"><span style=\"font-family:;color:\"><font color=\"#0000ff\"><font style=\"font-size: 9.5pt\">#include<\/font><\/font><\/span><font style=\"font-size: 9.5pt\"><span style=\"font-family:;color:\"><font color=\"#000000\"> <\/font><\/span><\/font><span style=\"font-family:;color:\"><font style=\"font-size: 9.5pt\" color=\"#a31515\">&lt;iostream&gt;<\/font><\/span><\/font><span style=\"font-family:;color:\"><\/span><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><span style=\"font-family:;color:\"><font face=\"Consolas\"><font style=\"font-size: 9.5pt\" color=\"#000000\">&nbsp;<\/font><\/font><\/span><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><font face=\"Consolas\"><span style=\"font-family:;color:\"><font color=\"#0000ff\"><font style=\"font-size: 9.5pt\">auto<\/font><\/font><\/span><font style=\"font-size: 9.5pt\"><span style=\"font-family:;color:\"><font color=\"#000000\"> <\/font><\/span><span style=\"font-family:;color:\"><font color=\"#0000ff\">operator<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\"> await(std::chrono::<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#2b91af\">sys\ntem_clock<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\">::<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#2b91af\">duration<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\"> <\/font><\/span><span style=\"font-family:;color:\"><font color=\"#808080\">duration<\/font><\/span><\/font><span style=\"font-family:;color:\"><font style=\"font-size: 9.5pt\" color=\"#000000\">) {<\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><font face=\"Consolas\"><span style=\"font-family:;color:\"><span><font color=\"#000000\"><font style=\"font-size: 9.5pt\">&nbsp; <\/font><\/font><\/span><\/span><font style=\"font-size: 9.5pt\"><span style=\"font-family:;color:\"><font color=\"#0000ff\">class<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\"> <\/font><\/span><span style=\"font-family:;color:\"><font color=\"#2b91af\">awaiter<\/font><\/span><\/font><span style=\"font-family:;color:\"><font style=\"font-size: 9.5pt\" color=\"#000000\"> {<\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><font face=\"Consolas\"><span style=\"font-family:;color:\"><span><font color=\"#000000\"><font style=\"font-size: 9.5pt\">&nbsp;&nbsp;&nbsp; <\/font><\/font><\/span><\/span><font style=\"font-size: 9.5pt\"><span style=\"font-family:;color:\"><font color=\"#0000ff\">static<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\"> <\/font><\/span><span style=\"font-family:;color:\"><font color=\"#0000ff\">void<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\"> <\/font><\/span><span style=\"font-family:;color:\"><font color=\"#6f008a\">CALLBACK<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\"> TimerCallback(<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#2b91af\">PTP_CALLBACK_INSTANCE<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\">, <\/font><\/span><span style=\"font-family:;color:\"><font color=\"#0000ff\">void<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\"> *<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#808080\">Context<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\">, <\/font><\/span><span style=\"font-family:;color:\"><font color=\"#2b91af\">PTP_TIMER<\/font><\/span><\/font><span style=\"font-family:;color:\"><font style=\"font-size: 9.5pt\" color=\"#000000\">) {<\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><font face=\"Consolas\"><span style=\"font-family:;color:\"><font color=\"#000000\"><span><font style=\"font-size: 9.5pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><\/span><font style=\"font-size: 9.5pt\">std::experimental::<\/font><\/font><\/span><font style=\"font-size: 9.5pt\"><span style=\"font-family:;color:\"><font color=\"#2b91af\">coroutine_handle<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\">&lt;&gt;::from_address(<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#808080\">Context<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\">)<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#008080\">()<\/font><\/span><\/font><span style=\"font-family:;color:\"><font style=\"font-size: 9.5pt\" color=\"#000000\">;<\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><span style=\"font-family:;color:\"><font face=\"Consolas\"><font color=\"#000000\"><span><font style=\"font-size: 9.5pt\">&nbsp;&nbsp;&nbsp; <\/font><\/span><font style=\"font-size: 9.5pt\">}<\/font><\/font><\/font><\/span><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><font face=\"Consolas\"><span style=\"font-family:;color:\"><span><font color=\"#000000\"><font style=\"font-size: 9.5pt\">&nbsp;&nbsp;&nbsp; <\/font><\/font><\/span><\/span><font style=\"font-size: 9.5pt\"><span style=\"font-family:;color:\"><font color=\"#2b91af\">PTP_TIMER<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\"> timer = <\/font><\/span><span style=\"font-family:;color:\"><font color=\"#0000ff\">nullptr<\/font><\/span><\/font><span style=\"font-family:;color:\"><font style=\"font-size: 9.5pt\" color=\"#000000\">;<\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><font face=\"Consolas\"><span style=\"font-family:;color:\"><font color=\"#000000\"><span><font style=\"font-size: 9.5pt\">&nbsp;&nbsp;&nbsp; <\/font><\/span><font style=\"font-size: 9.5pt\">std::chrono::<\/font><\/font><\/span><font style=\"font-size: 9.5pt\"><span style=\"font-family:;color:\"><font color=\"#2b91af\">system_clock<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\">::<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#2b91af\">duration<\/font><\/span><\/font><span style=\"font-family:;color:\"><font style=\"font-size: 9.5pt\" color=\"#000000\"> duration;<\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><font face=\"Consolas\"><span style=\"font-family:;color:\"><span><font color=\"#000000\"><font style=\"font-size: 9.5pt\">&nbsp; <\/font><\/font><\/span><\/span><font style=\"font-size: 9.5pt\"><span style=\"font-family:;color:\"><font color=\"#0000ff\">public<\/font><\/span><\/font><span style=\"font-family:;color:\"><font style=\"font-size: 9.5pt\" color=\"#000000\">:<\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><font face=\"Consolas\"><span style=\"font-family:;color:\"><span><font color=\"#000000\"><font style=\"font-size: 9.5pt\">&nbsp;&nbsp;&nbsp; <\/font><\/font><\/span><\/span><font style=\"font-size: 9.5pt\"><span style=\"font-family:;color:\"><font color=\"#0000ff\">explicit<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\"> awaiter(std::chrono::<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#2b91af\">system_clock<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\">::<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#2b91af\">duration<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\"> <\/font><\/span><span style=\"font-family:;color:\"><font color=\"#808080\">d<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\">) : duration(<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#808080\">d<\/font><\/span><\/font><span style=\"font-family:;color:\"><font style=\"font-size: 9.5pt\" color=\"#000000\">) {}<\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><font face=\"Consolas\"><span style=\"font-family:;color:\"><span><font color=\"#000000\"><font style=\"font-size: 9.5pt\">&nbsp;&nbsp;&nbsp; <\/font><\/font><\/span><\/span><font style=\"font-size: 9.5pt\"><span style=\"font-family:;color:\"><font color=\"#0000ff\">bool<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\"> await_ready() <\/font><\/span><span style=\"font-family:;color:\"><font color=\"#0000ff\">const<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\"> { <\/font><\/span><span style=\"font-family:;color:\"><font color=\"#0000ff\">return<\/font><\/span><\/font><span style=\"font-family:;color:\"><font style=\"font-size: 9.5pt\" color=\"#000000\"> duration.count() &lt;= 0; }<\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><font face=\"Consolas\"><span style=\"font-family:;color:\"><span><font color=\"#000000\"><font style=\"font-size: 9.5pt\">&nbsp;&nbsp;&nbsp; <\/font><\/font><\/span><\/span><font style=\"font-size: 9.5pt\"><span style=\"font-family:;color:\"><font color=\"#0000ff\">bool<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\"> await_suspend(std::experimental::<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#2b91af\">coroutine_handle<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\">&lt;&gt; <\/font><\/span><span style=\"font-family:;color:\"><font color=\"#808080\">resume_cb<\/font><\/span><\/font><span style=\"font-family:;color:\"><font style=\"font-size: 9.5pt\" color=\"#000000\">) {<\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><font face=\"Consolas\"><span style=\"font-family:;color:\"><span><font color=\"#000000\"><font style=\"font-size: 9.5pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><\/font><\/span><\/span><font style=\"font-size: 9.5pt\"><span style=\"font-family:;color:\"><font color=\"#2b91af\">int64_t<\/font><\/span><\/font><span style=\"font-family:;color:\"><font style=\"font-size: 9.5pt\" color=\"#000000\"> relative_count = -duration.count();<\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><font face=\"Consolas\"><span style=\"font-family:;color:\"><font color=\"#000000\"><span><font style=\"font-size: 9.5pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><\/span><font style=\"font-size: 9.5pt\">timer = CreateThreadpoolTimer(TimerCallback, <\/font><\/font><\/span><font style=\"font-size: 9.5pt\"><span style=\"font-family:;color:\"><font color=\"#808080\">resume_cb<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\">.to_address(), <\/font><\/span><span style=\"font-family:;color:\"><font color=\"#0000ff\">nullptr<\/font><\/span><\/font><span style=\"font-family:;color:\"><font style=\"font-size: 9.5pt\" color=\"#000000\">);<\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><font face=\"Consolas\"><span style=\"font-family:;color:\"><font color=\"#000000\"><span><font style=\"font-size: 9.5pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><\/span><font style=\"font-size: 9.5pt\">SetThreadpoolTimer(timer, (<\/font><\/font><\/span><font style=\"font-size: 9.5pt\"><span style=\"font-family:;color:\"><font color=\"#2b91af\">PFILETIME<\/font><\/span><\/font><span style=\"font-family:;color:\"><font style=\"font-size: 9.5pt\" color=\"#0000\n00\">)&amp;relative_count, 0, 0);<\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><font face=\"Consolas\"><span style=\"font-family:;color:\"><span><font color=\"#000000\"><font style=\"font-size: 9.5pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><\/font><\/span><\/span><font style=\"font-size: 9.5pt\"><span style=\"font-family:;color:\"><font color=\"#0000ff\">return<\/font><\/span><\/font><span style=\"font-family:;color:\"><font style=\"font-size: 9.5pt\" color=\"#000000\"> timer != 0;<\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><span style=\"font-family:;color:\"><font face=\"Consolas\"><font color=\"#000000\"><span><font style=\"font-size: 9.5pt\">&nbsp;&nbsp;&nbsp; <\/font><\/span><font style=\"font-size: 9.5pt\">}<\/font><\/font><\/font><\/span><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><font face=\"Consolas\"><span style=\"font-family:;color:\"><span><font color=\"#000000\"><font style=\"font-size: 9.5pt\">&nbsp;&nbsp;&nbsp; <\/font><\/font><\/span><\/span><font style=\"font-size: 9.5pt\"><span style=\"font-family:;color:\"><font color=\"#0000ff\">void<\/font><\/span><\/font><span style=\"font-family:;color:\"><font style=\"font-size: 9.5pt\" color=\"#000000\"> await_resume() {}<\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><font face=\"Consolas\"><span style=\"font-family:;color:\"><font color=\"#000000\"><span><font style=\"font-size: 9.5pt\">&nbsp;&nbsp;&nbsp; <\/font><\/span><font style=\"font-size: 9.5pt\">~awaiter() { <\/font><\/font><\/span><font style=\"font-size: 9.5pt\"><span style=\"font-family:;color:\"><font color=\"#0000ff\">if<\/font><\/span><\/font><span style=\"font-family:;color:\"><font style=\"font-size: 9.5pt\" color=\"#000000\"> (timer) CloseThreadpoolTimer(timer); }<\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><span style=\"font-family:;color:\"><font face=\"Consolas\"><font color=\"#000000\"><span><font style=\"font-size: 9.5pt\">&nbsp; <\/font><\/span><font style=\"font-size: 9.5pt\">};<\/font><\/font><\/font><\/span><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><font face=\"Consolas\"><span style=\"font-family:;color:\"><span><font color=\"#000000\"><font style=\"font-size: 9.5pt\">&nbsp; <\/font><\/font><\/span><\/span><font style=\"font-size: 9.5pt\"><span style=\"font-family:;color:\"><font color=\"#0000ff\">return<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\"> <\/font><\/span><span style=\"font-family:;color:\"><font color=\"#2b91af\">awaiter<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\">{ <\/font><\/span><span style=\"font-family:;color:\"><font color=\"#808080\">duration<\/font><\/span><\/font><span style=\"font-family:;color:\"><font style=\"font-size: 9.5pt\" color=\"#000000\"> };<\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><span style=\"font-family:;color:\"><font face=\"Consolas\"><font style=\"font-size: 9.5pt\" color=\"#000000\">}<\/font><\/font><\/span><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><span style=\"font-family:;color:\"><font face=\"Consolas\"><font style=\"font-size: 9.5pt\" color=\"#000000\">&nbsp;<\/font><\/font><\/span><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><font face=\"Consolas\"><span style=\"font-family:;color:\"><font color=\"#0000ff\"><font style=\"font-size: 9.5pt\">using<\/font><\/font><\/span><font style=\"font-size: 9.5pt\"><span style=\"font-family:;color:\"><font color=\"#000000\"> <\/font><\/span><span style=\"font-family:;color:\"><font color=\"#0000ff\">namespace<\/font><\/span><\/font><span style=\"font-family:;color:\"><font style=\"font-size: 9.5pt\" color=\"#000000\"> std;<\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><font face=\"Consolas\"><span style=\"font-family:;color:\"><font color=\"#0000ff\"><font style=\"font-size: 9.5pt\">using<\/font><\/font><\/span><font style=\"font-size: 9.5pt\"><span style=\"font-family:;color:\"><font color=\"#000000\"> <\/font><\/span><span style=\"font-family:;color:\"><font color=\"#0000ff\">namespace<\/font><\/span><\/font><span style=\"font-family:;color:\"><font style=\"font-size: 9.5pt\" color=\"#000000\"> std::chrono;<\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><span style=\"font-family:;color:\"><font face=\"Consolas\"><font style=\"font-size: 9.5pt\" color=\"#000000\">&nbsp;<\/font><\/font><\/span><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><font face=\"Consolas\"><span style=\"font-family:;color:\"><font color=\"#2b91af\"><font style=\"font-size: 9.5pt\">future<\/font><\/font><\/span><font style=\"font-size: 9.5pt\"><span style=\"font-family:;color:\"><font color=\"#000000\">&lt;<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#0000ff\">void<\/font><\/span><\/font><span style=\"font-family:;color:\"><font style=\"font-size: 9.5pt\" color=\"#000000\">&gt; test() {<\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><font face=\"Consolas\"><span style=\"font-family:;color:\"><font color=\"#000000\"><span><font style=\"font-size: 9.5pt\">&nbsp; <\/font><\/span><font style=\"font-size: 9.5pt\">cout <\/font><\/font><\/span><font style=\"font-size: 9.5pt\"><span style=\"font-family:;color:\"><font color=\"#008080\">&lt;&lt;<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\"> this_thread::get_id() <\/font><\/span><span style=\"font-family:;color:\"><font color=\"#008080\">&lt;&lt;<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\"> <\/font><\/span><span style=\"font-family:;color:\"><font color=\"#a31515\">&#8220;: sleeping&#8230;\\n&#8221;<\/font><\/span><\/font><span style=\"font-family:;color:\"><font style=\"font-size: 9.5pt\" color=\"#000000\">;<\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><font face=\"Consolas\"><span style=\"font-family:;color:\"><span><font color=\"#000000\"><font style=\"font-size: 9.5pt\">&nbsp; <\/font><\/font><\/span><\/span><font style=\"font-size: 9.5pt\"><span style=\"font-family:;color:\"><font color=\"#0000ff\">await<\/font><\/span><\/font><span style=\"font-family:;color:\"><font style=\"font-size: 9.5pt\" color=\"#000000\"> 1ms;<\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><font face=\"Consolas\"><span style=\"font-family:;color:\"><font color=\"#000000\"><span><font style=\"font-size: 9.5pt\">&nbsp; <\/font><\/span><font style=\"font-size: 9.5pt\">cout <\/font><\/font><\/span><font style=\"font-size: 9.5pt\"><span style=\"font-family:;color:\"><font color=\"#008080\">&lt;&lt;<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\"> this_thread::get_id() <\/font><\/span><span style=\"font-family:;color:\"><font color=\"#008080\">&lt;&lt;<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\"> <\/font><\/span><span style=\"font-family:;color:\"><font color=\"#a31515\">&#8220;: woke up\\n&#8221;<\/font><\/span><\/font><span style=\"font-family:;color:\"><font style=\"font-size: 9.5pt\" color=\"#000000\">;<\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><span style=\"font-family:;color:\"><font face=\"Consolas\"><font style=\"font-size: 9.5pt\" color=\"#000000\">}<\/font><\/font><\/span><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><span style=\"font-family:;color:\"><font face=\"Consolas\"><font style=\"font-size: 9.5pt\" color=\"#000000\">&nbsp;<\/font><\/font><\/span><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><font face=\"Consolas\"><span style=\"font-family:;color:\"><font color=\"#0000ff\"><font style=\"font-size: 9.5pt\">int<\/font><\/font><\/span><span style=\"font-family:;color:\"><font style=\"font-size: 9.5pt\" color=\"#000000\"> main() {<\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><span style=\"font-family:;color:\"><font face=\"Consolas\"><font color=\"#000000\"><span><font style=\"font-size: 9.5pt\">&nbsp; <\/font><\/span><font style=\"font-size: 9.5pt\">test().get();<\/font><\/font><\/font><\/span><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 0pt;line-height: normal\"><font face=\"Consolas\"><span style=\"font-family:;color:\"><font color=\"#000000\"><span><font style=\"font-size: 9.5pt\">&nbsp; <\/font><\/span><font style=\"font-size: 9.5pt\">cout <\/font><\/font><\/span><font style=\"font-size: 9.5pt\"><span style=\"font-family:;color:\"><font color=\"#008080\">&lt;&lt;<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\"> this_thread::get_id() <\/font><\/span><span style=\"font-family:;color:\"><font color=\"#008080\">&lt;&lt;<\/font><\/span><span style=\"font-family:;color:\"><font color=\"#000000\"> <\/font><\/span><span style=\"font-family:;color:\"><font color=\"#a31515\">&#8220;: back in main\\n&#8221;<\/font><\/span><\/font><span style=\"font-family:;color:\"><font style=\"font-size: 9.5pt\" color=\"#000000\">;<\/font><\/span><\/font><\/p>\n<p class=\"MsoNormal\" style=\"list-style-type: disc;margin: 0in 0in 8pt;line-height: 12pt\"><span style=\"font-family:;color:;line-height: 10pt\"><font face=\"Consolas\"><font style=\"font-size: 9.5pt\" color=\"#000000\">}<\/font><\/font><\/span><\/p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In preview of Visual Studio 2015, we introduced Coroutines for C++, see these blog post for an introduction and here. You can also look at the CPPCon 2015 talk about C++ Coroutines here. We continue to work on resumable functions, here it is a brief update on coroutines status in VS 2015 Update 1. See [&hellip;]<\/p>\n","protected":false},"author":316,"featured_media":35994,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[140,100,249,250,251],"class_list":["post-7361","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cplusplus","tag-c","tag-c-language","tag-coroutines","tag-resumable-functions","tag-visual-studio-update-1"],"acf":[],"blog_post_summary":"<p>In preview of Visual Studio 2015, we introduced Coroutines for C++, see these blog post for an introduction and here. You can also look at the CPPCon 2015 talk about C++ Coroutines here. We continue to work on resumable functions, here it is a brief update on coroutines status in VS 2015 Update 1. See [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts\/7361","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/users\/316"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/comments?post=7361"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts\/7361\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/media\/35994"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/media?parent=7361"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/categories?post=7361"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/tags?post=7361"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}