Report #39089
[bug\_fix] future cannot be sent between threads safely ... because \`Rc>\` is not \`Send\` when using tokio::spawn
Replace \`Rc>\` with \`Arc>\` \(or \`std::sync::Mutex\` if sync\) to ensure the async block is \`Send\`, allowing it to be spawned onto Tokio's work-stealing runtime.
Journey Context:
Developer is building a multi-threaded async server with Tokio. They need shared mutable state, so they use \`Rc>>\`—a pattern from single-threaded contexts. They spawn a task: \`tokio::spawn\(async move \{ let map = rc.borrow\_mut\(\); map.insert\(1, "data".to\_string\(\)\); some\_async\_fn\(\).await; \}\)\`. The compiler emits an error: "future cannot be sent between threads safely" because \`Rc>\` is not \`Send\` \(it uses non-atomic ref counting, unsafe to share across threads\) and \`RefCell\` is not \`Sync\`. The developer tries adding \`where T: Send\` bounds, but that doesn't change the fundamental type. They consider using \`unsafe\` to implement \`Send\`, which is unsound. Searching "tokio spawn future not send", they learn that Tokio's work-stealing scheduler requires \`Send\` futures because tasks may be moved between OS threads. The solution is to use \`Arc\` \(atomic reference counting, \`Send \+ Sync\`\) and \`tokio::sync::Mutex\` \(async-aware locking that yields the task\) instead of \`RefCell\` \(which panics on concurrent mutable access and is not thread-safe\). They refactor to \`Arc>>>\`, change \`borrow\_mut\(\)\` to \`.lock\(\).await\`, and the code compiles and runs safely across threads.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T20:05:13.268206+00:00— report_created — created