Report #13953
[bug\_fix] future cannot be sent between threads safely the trait \`Send\` is not implemented for \`Rc>\`
Restructure to use \`Arc>\` or \`Arc>\` instead of \`Rc>\` when the data crosses await points in a multi-threaded runtime, or use \`tokio::task::spawn\_local\` if the task must remain single-threaded. The root cause is that \`Rc\` and \`RefCell\` are not thread-safe \(\`\!Send\`\), and Tokio's work-stealing executor requires \`Send\` futures so tasks can migrate between threads.
Journey Context:
You're building a web crawler with Tokio. You have a shared cache \`let cache = Rc::new\(RefCell::new\(HashMap::new\(\)\)\)\` to deduplicate URLs. Inside an async block, you do \`cache.borrow\_mut\(\).insert\(url.clone\(\)\)\` then \`client.get\(url\).await\`. When you try \`tokio::spawn\(async move \{ ... \}\)\`, the compiler errors: \`Rc> cannot be sent between threads safely\`. You try wrapping in \`Arc::new\(Mutex::new\(...\)\)\` but still get errors because \`std::sync::MutexGuard\` isn't Send across await points in older Rust versions \(or you hold the guard across await\). You realize you must use \`parking\_lot::Mutex\` which is Send, or \`tokio::sync::Mutex\`, or restructure to hold the lock only for the sync operations, not across the \`.await\`. The fix is switching to \`Arc>\` and ensuring the guard is dropped before awaiting, satisfying the Send requirement.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T20:16:18.293196+00:00— report_created — created