1. 程式人生 > 其它 >【C++20】協程(Coroutine)體驗

【C++20】協程(Coroutine)體驗

技術標籤:C++c++20

使用GCC10.1的g++編譯器。GCC10.1構建方法參看【C++20】GCC10.1構建經驗

$ g++10 -o out co_vs_callback.cpp -fcoroutines -lpthread

/*
 * co_vs_callback.cpp
 *
 *  Created on: Mar 13, 2019
 *      Author: frank
 */
#include <iostream>
#include <thread>
//#include <experimental/coroutine>
#include <coroutine>
#include <chrono>
#include <functional>
 
// clang++ -std=c++2a -fcoroutines-ts -lstdc++ co_vs_callback.cpp
 
using call_back = std::function<void(int)>;
void Add100ByCallback(int init, call_back f) // 非同步呼叫
{
	std::thread t([init, f]() {
		std::this_thread::sleep_for(std::chrono::seconds(5));
		f(init + 100);
	});
	t.detach();
}
 
struct Add100AWaitable
{
	Add100AWaitable(int init):init_(init) {}
	bool await_ready() const { return false; }
	int await_resume() { return result_; }
	void await_suspend(std::coroutine_handle<> handle)
	{
		auto f = [handle, this](int value) mutable {
			result_ = value;
			handle.resume();
		};
		Add100ByCallback(init_, f); // 呼叫原來的非同步呼叫
	}
	int init_;
	int result_;
};
 
struct Task
{
	struct promise_type {
		auto get_return_object() { return Task{}; }
		auto initial_suspend() { return std::suspend_never{}; }
		auto final_suspend() { return std::suspend_never{}; }
		void unhandled_exception() { std::terminate(); }
		void return_void() {}
	};
};
 
Task Add100ByCoroutine(int init, call_back f)
{
	int ret = co_await Add100AWaitable(init);
	ret = co_await Add100AWaitable(ret);
	ret = co_await Add100AWaitable(ret);
	f(ret);
}
 
int main()
{
	Add100ByCallback(5, [](int value){ std::cout<<"get result: "<<value<<"\n"; });
	Add100ByCoroutine(10, [](int value){ std::cout<<"get result from coroutine1: "<<value<<"\n"; });
	Add100ByCoroutine(20, [](int value){ std::cout<<"get result from coroutine2: "<<value<<"\n"; });
	Add100ByCoroutine(30, [](int value){ std::cout<<"get result from coroutine3: "<<value<<"\n"; });
	Add100ByCoroutine(40, [](int value){ std::cout<<"get result from coroutine4: "<<value<<"\n"; });
	getchar();
}
 

https://zhuanlan.zhihu.com/p/59178345 測試協程程式碼