真实验证 build.rs:在编译前运行,生成 OUT_DIR/gen.rs、设置 rustc-env 与 rustc-cfg、打印 cargo:warning;用日志计数验证 rerun-if-changed(没改动 1 次、改 data.txt 2 次、只改 main.rs 2 次)与不写时的默认重跑;panic 令构建失败;build.rs 能读到的环境变量。
用 22 个类型的真实编译验证 Send 与 Sync:Rc 两者皆非、Cell/RefCell/Receiver 是 Send 不 Sync、MutexGuard 是 Sync 不 Send、Mutex/RwLock/Atomic/Arc<Mutex> 两者皆是;跨线程错误 E0277 的真实措辞;裸指针要 unsafe impl Send;自动 trait 沿字段传染。
用真实运行验证线程的创建与回收:join 返回结果、线程名与 id;借用局部变量报 E0373,move 后主线程不能再用(E0382);不 join 时子线程被进程退出终止;8 次运行 3 种执行顺序;thread::scope 借用无需 move,spawn+join 约 25 µs;小栈上递归 2000 层栈溢出 abort。
用真实运行验证通道的基本语义:recv 阻塞约 100 ms 等到消息;send 移动所有权(E0382);所有发送端 drop 后 recv 返回 Err、迭代结束;try_recv 区分 Empty 与 Disconnected;接收端 drop 后 send 退回原值;Rc 不能发送(E0277);发送 100 万元素的 Vec 不复制数据。
用真实运行验证 mpsc:多生产者 clone 发送端、单生产者内保序、不同生产者交错;忘记 drop 原 tx 会让接收端一直等;Receiver 不能 clone 且不是 Sync;用 Arc<Mutex<Receiver>> 实现多消费者;sync_channel 的阻塞与会合;吞吐量无界 11.7 ms、容量 1 的有界通道 2384.3 ms。
用真实运行对比 Mutex 与 RwLock:4 个线程各持 50 ms,Mutex 约 210 ms 串行、RwLock 读约 50 ms 并行、写约 220 ms;try_lock/try_read/try_write 的互斥关系;同线程重复 lock 死锁;4 线程 × 200 万次极短读,Mutex 149.6 ms 而 RwLock 917.4 ms。
用真实运行验证 Condvar:wait 释放锁并睡眠、醒来重新检查条件;wait 期间 try_lock 成功;先通知后等待会丢通知(wait_timeout 超时),用 bool 状态变量修复;notify_one 唤醒 1 个、notify_all 唤醒 5 个;阻塞队列墙钟约 550 ms 而 CPU 约 1 ms。
用真实运行验证原子类型与内存序:fetch_add 恰好 4000000 而 load+store 只剩 1005154;Relaxed/AcqRel/SeqCst 的单线程与争用成本;在 aarch64 上消息传递测试里 Relaxed 4 次运行出现 2、24、3、672 次「看到 flag 却没看到 data」,Release/Acquire 为 0。
用真实运行验证 compare_exchange:成功返回 Ok(旧值)、失败返回 Err(当前值);手写 CAS 循环 fetch_mul3(80000 次调用结果与顺序执行相同,59728 次重试);fetch_update;自旋锁保护 400000;ABA 问题与版本号;本机 aarch64 上 weak 与 strong 都编译成 casal,虚假失败 0 次。
用真实编译验证数据竞争为什么无法通过编译:两个线程 &mut 同一变量 E0499、一读一写 E0502;合法的共享只读与不重叠 &mut 切片;static mut 引用 deny;闭包只捕获字段导致 unsafe impl Sync 也被拒绝;unsafe 里的真实数据竞争 4000000 → 999862;安全代码里的逻辑竞态卖出 4 件。
真实下载 rayon 验证并行迭代器:par_iter 保序 collect;2000 万个 sin 求和串行 57.2 ms 对并行 8.9 ms(6.4×,10 线程);小任务并行更慢;线程数从 1 到 10 的加速曲线;for_each + Mutex 慢到 110.97 ms 而 reduce 只要 0.65 ms;闭包仍受 Sync 约束(E0277)。
用手写的 poll 循环(Waker::noop())验证 Future 与 Poll:async fn 只创建 Future 不执行;第一次 poll 才运行;手写 Countdown 返回 3 次 Pending 后 Ready;await 把 Pending 向上传并从停下处继续(外层 poll 4 次);没 poll 就 drop 则函数体不运行,poll 一半就 drop 则局部变量立即析构;忘记 await 的警告。