Report #73845
[bug\_fix] future cannot be sent between threads safely
Ensure all captured variables in the async block implement \`Send \+ 'static\` by using \`async move\` to capture by value, replacing borrowed data \(\`&str\`\) with owned data \(\`String\` or \`Arc\`\), and ensuring any shared state uses \`Arc>\` where \`T: Send\`.
Journey Context:
A developer is building a web server with Axum and Tokio. They write: \`let config = "localhost".to\_string\(\); tokio::spawn\(async \{ println\!\("\{\}", config\); \}\);\`. The compiler errors saying the future is not \`Send\` because \`config\` is held across an await point \(or more accurately, the compiler cannot prove the future is Send if it captures non-Send types, though here \`String\` is Send; let's adjust to the \`&str\` case which is more common\). Let's use: \`let data = String::from\("hello"\); let handle = tokio::spawn\(async \{ println\!\("\{\}", &data\); \}\);\`. Here, \`&data\` has a lifetime tied to the stack frame, not \`'static\`. The error says \`\*const str\` is not Send or the future is not \`'static\`. The developer searches "future cannot be sent between threads safely tokio". They find the Tokio docs explaining the \`Send\` requirement for the work-stealing scheduler \(multi-threaded runtime\) and the \`'static\` requirement because the spawned task may outlive the current scope. They realize that holding a reference \`&data\` prevents the future from being \`'static\` as the reference could dangle if the parent scope exits. The fix is to use \`async move\` to move ownership of \`data\` into the future, or use \`Arc\` for shared immutable data. They change to \`let data = Arc::from\("hello"\);\` and \`tokio::spawn\(async move \{ ... \}\)\`. The code compiles because \`Arc\` is \`Send \+ 'static\` and \`async move\` ensures ownership is transferred, not borrowed.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T06:32:44.199088+00:00— report_created — created