目前共有4篇帖子。
![]() |
【test.cpp】 #include <coroutine> #include <iostream> struct return_object { struct promise_type { return_object get_return_object() { return_object obj; obj.that = this; return obj; } std::suspend_never initial_suspend() { std::suspend_never never; return never; } std::suspend_never final_suspend() noexcept { std::suspend_never never; return never; } void unhandled_exception() { } }; promise_type *that; }; return_object counter() { std::cout << "counter begin" << std::endl; for (int i = 0; i < 10; i++) { std::suspend_always a; co_await a; std::cout << "counter: " << i << std::endl; } } int main() { return_object r = counter(); std::coroutine_handle<return_object::promise_type> h = std::coroutine_handle<return_object::promise_type>::from_promise(*r.that); for (int i = 0; i < 3; i++) { std::cout << "in main function" << std::endl; h(); } h.destroy(); return 0; } 【編譯命令】 g++ test.cpp -o test -fcoroutines 【程序運行結果】 |
![]() |
My tutorial and take on C++20 coroutines
David Mazières February, 2021 https://www.scs.stanford.edu/~dm/blog/c++-coroutines.html std::coroutine_handle, std::noop_coroutine_handle |
![]() |
【test.cpp】 #include <coroutine> #include <iostream> struct return_object { struct promise_type { return_object get_return_object() { std::cout << "get_return_object" << std::endl; return_object obj; obj.that = this; return obj; } std::suspend_never initial_suspend() { std::cout << "initial_suspend" << std::endl; std::suspend_never never; return never; } std::suspend_never final_suspend() noexcept { std::cout << "final_suspend" << std::endl; std::suspend_never never; return never; } void unhandled_exception() { std::cout << "unhandled_exception" << std::endl; } }; promise_type *that; }; return_object counter() { std::cout << "counter begin" << std::endl; for (int i = 0; i < 2; i++) { std::suspend_always a; co_await a; std::cout << "counter: " << i << std::endl; } } int main() { return_object r = counter(); std::coroutine_handle<return_object::promise_type> h = std::coroutine_handle<return_object::promise_type>::from_promise(*r.that); for (int i = 0; i < 2; i++) { std::cout << "in main function" << std::endl; h(); } return 0; } 【程序運行結果】 oct1158@oct1158-ubuntu:~/Documents/Code/C/test/coroutine$ ./test (因為counter函數執行完畢了,所以h自動銷毀了,不用自己調用h.destroy())。 |
![]() |
Windows 7的Visual Studio 2019支持ISO C++20 標準 (/std:c++20),所以可以使用協程。
但是因為無法使用Visual Studio 2017 - Windows XP (v141_xp)編譯器,所以編譯出來的程序不支持Windows XP系統。
|