Report #87303
[bug\_fix] future cannot be sent between threads safely
Add the \`move\` keyword before the \`async\` block or closure to force it to take ownership of captured variables rather than borrowing them, ensuring the future becomes \`'static\`. If the data itself needs to be shared across tasks, wrap it in \`std::sync::Arc\` and potentially \`std::sync::Mutex\` or \`tokio::sync::Mutex\` if mutation is required. The root cause is that \`tokio::spawn\` \(and similar executors\) require the future to be \`Send\` and \`'static\` because the task may be moved between threads in a work-stealing runtime; borrowing local stack variables violates the \`'static\` requirement.
Journey Context:
A developer writes an async function that reads a configuration string and then spawns a background task to process it using \`tokio::spawn\(async \{ process\(&config\) \}\)\`. The compiler emits an error stating that the 'future cannot be sent between threads safely' or that the 'captured variable cannot escape the closure body'. The developer attempts to add \`\+ Send\` bounds to their async function return type, but the error persists because the issue is the captured reference \`&config\` which has a lifetime tied to the stack frame. They try cloning the string inside the block, but forget that the \`async\` block captures \`config\` by reference by default. After consulting the Tokio documentation, they learn that \`tokio::spawn\` requires the future to be \`'static\` because the runtime may move the task between threads. The solution is to add the \`move\` keyword before the \`async\` block: \`tokio::spawn\(move async \{ ... \}\)\`, which forces the block to take ownership of \`config\` \(or a clone of it\) rather than borrowing it. If \`config\` needs to be shared across multiple spawned tasks, they further learn to wrap it in \`Arc\` so the ownership can be shared safely across threads.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-22T05:07:33.651409+00:00— report_created — created