协程(Coroutines)是一种并发编程的技术,它允许在函数执行期间暂停,并在稍后恢复。C++20引入了协程的支持,使得编写异步、可读性更高的代码变得更容易。
下面是一些与C++20协程相关的基本概念和关键字:
-
协程声明: 使用
co_
前缀来声明协程关键字,例如co_await
、co_return
。 -
协程句柄: 协程通过句柄来管理,
std::coroutine_handle
表示协程的句柄,可以通过协程的promise_type
来获取协程句柄。 -
协程的 promise_type: 协程的声明中包含
struct promise_type
,其中定义了协程的行为。get_return_object
用于创建协程的实例,initial_suspend
和final_suspend
定义了协程的开始和结束时的行为。 -
协程的状态: 协程可以处于三种状态之一:暂停、完成和运行。
-
协程挂起: 使用
co_await
关键字来挂起协程,等待异步操作完成。 -
协程返回: 使用
co_return
关键字来返回值并结束协程。
下面是一个简单的协程示例:
#include <iostream>
#include <coroutine>
struct AsyncTask {
struct promise_type {
AsyncTask get_return_object() {
return {}; // 返回协程句柄
}
std::suspend_never initial_suspend() { return {}; }
std::suspend_never final_suspend() noexcept { return {}; }
void unhandled_exception() {}
void return_void() {}
};
// 协程暂停点
bool await_ready() const noexcept { return false; }
void await_suspend(std::coroutine_handle<promise_type>) const noexcept {
// 在这里可以执行一些异步操作,这里使用sleep模拟
std::this_thread::sleep_for(std::chrono::seconds(3));
std::cout << "Async task completed!" << std::endl;
}
void await_resume() const noexcept {}
};
// 使用协程
AsyncTask asyncTask() {
std::cout << "Async task started..." << std::endl;
co_await std::suspend_always{}; // 等待异步操作完成
std::cout << "Main thread continues..." << std::endl;
}
int main() {
asyncTask();
return 0;
}
在这个例子中,AsyncTask
是一个简单的协程类型,通过co_await
等待异步操作完成。在 await_suspend
函数中,可以执行真实的异步操作,这里使用 std::this_thread::sleep_for
模拟一个异步任务。
需要注意的是,协程的支持需要编译器对C++20的支持,且在编译时需要添加 -fcoroutines
(对于GCC)或 /std:c++latest
(对于MSVC)等选项。