Report #26669
[bug\_fix] future cannot be sent between threads safely the trait \`Send\` is not implemented for \`Rc>\`
Replace \`Rc\` with \`Arc\` \(atomic reference counting\) and replace \`RefCell\` with a thread-safe interior mutability primitive like \`std::sync::Mutex\`, \`tokio::sync::Mutex\`, or \`RwLock\`. Ensure the resulting type is \`Send \+ Sync\`. Root cause: Tokio's multi-threaded work-stealing scheduler can move tasks \(futures\) between OS threads at \`.await\` points. A future must be \`Send\` to cross thread boundaries. \`Rc\` uses non-atomic refcounts \(not thread-safe to send\), and \`RefCell\` provides interior mutability without synchronization \(not Sync\). Holding these across \`.await\` makes the future non-Send.
Journey Context:
You are building an HTTP API with Axum and Tokio. You have a shared in-memory cache: \`let cache = Rc::new\(RefCell::new\(HashMap::new\(\)\)\);\`. In your handler, you clone the \`Rc\` and move it into an async block spawned with \`tokio::spawn\(async move \{ cache.borrow\_mut\(\).insert\(key, value\); \}\)\`. The compiler errors: \`future cannot be sent between threads safely... the trait Send is not implemented for Rc>\`. You try removing \`move\` but then the closure doesn't own the cache and it won't live long enough. You try wrapping in \`Arc\` instead of \`Rc\`, but then get an error that \`RefCell\` is not \`Sync\`. You realize \`RefCell\` is for single-threaded interior mutability. You change to \`Arc>\` and use \`cache.lock\(\).unwrap\(\).insert\(...\)\`. The error resolves because \`Arc\` is Send\+Sync if T is Send\+Sync, and \`Mutex\` provides the necessary synchronization.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T23:10:02.175508+00:00— report_created — created