We interfaced single-threaded C++ with multi-threaded Rust
3 months ago
- #Rust
- #Thread Safety
- #C++
- The blog post discusses interfacing single-threaded C++ with multi-threaded Rust, adapted from a talk at Rust UnConf.
- Antithesis uses a deterministic hypervisor (Determinator) to test software in containers, replacing non-deterministic operations with controlled signals.
- The fuzzer, written in single-threaded C++, interacts with controllers via a callback interface to find bugs.
- A Rust interface was added to the fuzzer for easier implementation of new control strategies, introducing multi-threading and asynchronicity.
- The post details challenges in combining C++ and Rust, focusing on thread safety and object management across languages.
- Initial solutions involved CppOwner and CppBorrower to manage C++ objects safely across threads, but had garbage collection inefficiencies.
- An improved solution uses SendWrapper to safely pass C++ objects across threads and ensures proper destruction on the main thread.
- The MainThreadToken was introduced to safely call C++ functions that are only thread-safe on the main thread.
- C++ methods were categorized into SYNC and UNSYNC to clarify thread safety, with Rust wrappers enforcing these constraints.
- The methodology ensures Rust's compiler can enforce thread safety, making the interface production-ready.