好奇的探索者,理性的思考者,踏实的行动者。
它允许程序以更加顺序、简洁和可读的方式处理异步任务,避免了回调地狱和复杂的多线程同步问题。协程允许你在函数中暂停执行,并在稍后恢复执行,同时保持函数的上下文状态。
例子:
#include <iostream>
#include <coroutine>
#include <chrono>
#include <thread>
struct MyCoroutine {
struct promise_type {
MyCoroutine get_return_object() {return MyCoroutine(std::coroutine_handle<promise_type>::from_promise(*this));
}std::suspend_always initial_suspend() { return {}; }
std::suspend_always final_suspend() { return {}; }
void return_void() {}
void unhandled_exception() {}
};
std::coroutine_handle<promise_type> handle) : handle(handle) {}
MyCoroutine(
~MyCoroutine() {if (handle) {
handle.destroy();
}
}
std::coroutine_handle<promise_type> handle;
};
MyCoroutine myCoroutine() {std::cout << "Coroutine started." << std::endl;
co_await std::chrono::seconds(2);
std::cout << "Coroutine resumed after waiting." << std::endl;
}
int main() {
auto coroutine = myCoroutine();
std::cout << "Main thread." << std::endl;
coroutine.handle.resume();std::cout << "Back to main thread." << std::endl;
return 0;
}
C++标准库在C++20中引入了基本的协程支持,如std::coroutine_handle、co_await、co_yield等,但没有提供类似于其他语言中完整的高级协程库,原因主要是因为协程的应用场景复杂多样,不同的协程库有不同的设计理念和特性。
协程的应用场景非常广泛,涵盖了生成器、异步任务、状态机等不同的用途。不同的应用场景可能需要不同的库设计,单一的高级协程库难以满足所有需求,可能导致库设计和接口复杂化。