cxx-async 项目使用指南
项目介绍
cxx-async
是一个 Rust 库,它扩展了 cxx
库,以提供异步 Rust 代码(使用 async/await
)和 C++20 协程(使用 co_await
)之间的互操作性。如果你的 C++ 代码是异步的,cxx-async
可以提供一个更方便和潜在更高效的替代回调的方法。你可以自由地在 C++ 协程和 Rust 的 futures 或 streams 之间转换,并从一个中等待另一个。
需要注意的是,cxx-async
不是一个 C++ 绑定到 Tokio 或其他 Rust I/O 库的库,也不是一个 Rust 绑定到 boost::asio
或类似的库。虽然原则上可以在 cxx-async
之上构建这些绑定,但这个库本身并不提供它们。
项目快速启动
添加依赖
首先,在你的 Rust 项目中添加 cxx
和 cxx-async
依赖:
[dependencies]
cxx = "1.0"
cxx-async = "0.1"
定义桥接模块
在你的 #[cxx::bridge]
模块中声明 future 类型和一些方法:
#[cxx::bridge]
mod ffi {
// 声明你希望使用的 future 类型的别名
type RustFutureString = crate::RustFutureString;
// 声明你希望 Rust 调用的异步 C++ 方法
unsafe extern "C++" {
fn hello_from_cpp() -> RustFutureString;
}
}
定义 C++ 代码
在 C++ 代码中定义异步方法:
RustFutureString hello_from_cpp() {
co_return std::string("Hello world");
}
定义 Rust 代码
在 Rust 代码中调用 C++ 方法:
async fn call_cpp() -> String {
// 这会返回一个 RustFutureString 类型的 future
ffi::hello_from_cpp().await
}
应用案例和最佳实践
异步互操作
cxx-async
的一个典型应用案例是在需要异步互操作的场景中。例如,你可能有一个异步的 C++ 库,你希望在 Rust 中使用它,并且希望以异步的方式调用其方法。cxx-async
提供了一种简单的方式来实现这一点。
性能优化
通过使用 cxx-async
,你可以避免回调地狱,并且可以更高效地管理异步任务。这对于性能敏感的应用程序尤其重要。
典型生态项目
cppcoro
cxx-async
旨在与流行的 C++ 协程支持库兼容,目前支持轻量级的 cppcoro
和更全面的 Folly。你可以通过 pull request 来支持其他库。
Tokio
虽然 cxx-async
本身不提供对 Tokio 的绑定,但你可以基于 cxx-async
构建与 Tokio 的互操作层。这需要确保 Rust 和 C++ 侧运行独立的 I/O 执行器。
通过这些步骤和案例,你可以开始使用 cxx-async
来实现 Rust 和 C++ 之间的异步互操作。