在 C++ 中,co_await
關鍵字用于表示一個協程(coroutine)的掛起點
首先,確保你的編譯器支持 C++20 標準并啟用相應的編譯選項。例如,對于 g++ 或 clang++,使用 -std=c++20 -fcoroutines
選項。
接下來,創建一個簡單的異步 I/O 操作,例如讀取文件內容:
#include<iostream>
#include <fstream>
#include<string>
#include<chrono>
#include<thread>
#include <coroutine>
#include <experimental/coroutine>
struct Task {
struct promise_type {
Task get_return_object() { return {}; }
std::suspend_never initial_suspend() { return {}; }
std::suspend_never final_suspend() noexcept { return {}; }
void return_void() {}
void unhandled_exception() { std::terminate(); }
};
};
Task asyncReadFile(const std::string& filename) {
std::ifstream file(filename);
std::string content((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
std::this_thread::sleep_for(std::chrono::seconds(1)); // 模擬 I/O 操作
std::cout << "File content: "<< content<< std::endl;
co_return;
}
int main() {
asyncReadFile("example.txt");
std::cout << "Waiting for I/O operation..."<< std::endl;
std::this_thread::sleep_for(std::chrono::seconds(2)); // 等待協程完成
return 0;
}
在這個例子中,我們定義了一個名為 Task
的協程類型,它包含一個 promise_type
結構體,用于定義協程的行為。然后,我們創建了一個名為 asyncReadFile
的異步函數,該函數使用 co_await
關鍵字掛起并在 I/O 操作完成后恢復執行。
請注意,這個例子僅用于演示目的,實際上你可能需要使用更復雜的異步 I/O 庫(如 Boost.Asio)來處理真正的異步 I/O 操作。此外,你還需要一個支持協程的運行時環境,例如 C++20 協程庫或 Boost.Coroutine。