Report #66716
[bug\_fix] future cannot be sent between threads safely
Replace non-Send types \(like \`Rc\`, \`RefCell\`, raw pointers\) with thread-safe alternatives \(\`Arc\`, \`tokio::sync::Mutex\` or \`std::sync::Mutex\` if contention is low\). Ensure all captured variables in the async block are \`Send \+ Sync\` if held across await points.
Journey Context:
Developer is building a high-performance web scraper with Tokio. They have shared state \`let counter = Rc::new\(RefCell::new\(0\)\);\` and an HTTP client wrapped in \`Rc>\`. They spawn tasks in a loop: \`tokio::spawn\(async move \{ let mut c = counter.borrow\_mut\(\); \*c \+= 1; client.borrow\(\).get\(url\).await; \}\)\`. The compiler errors with \`dyn Future cannot be sent between threads safely\`. The error points to \`Rc>\` as the culprit because it is \`\!Send\`. The developer tries wrapping in \`Arc\` but keeps \`RefCell\`, getting the same error because \`RefCell\` is \`\!Sync\` and the future is held across an \`.await\`. They try \`Arc>\` using \`std::sync::Mutex\` and block the thread, killing performance. Finally, they realize that Tokio requires tasks to be \`Send\` because the work-stealing scheduler may move tasks between threads. They replace \`Rc\` with \`Arc\` and \`RefCell\` with \`tokio::sync::Mutex\` \(or \`RwLock\`\), ensuring all captured variables are \`Send \+ Sync\`. This allows the future to be safely sent between threads in the thread pool, resolving the compilation error.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T18:27:50.163236+00:00— report_created — created