无锁结构
实测:手工排出交错的 ABA 演示里,A 的 CAS 返回"成功"并把早已弹走的节点接回链表;4 线程随机对拍 30 万步,无锁栈重复取走 0 个(结构正确)却比有锁栈慢 2.07 倍(58.5ms vs 28.3ms),而单线程无竞争时它反而快 1.45 倍(12.59 vs 18.25 ns/次)。
实测:手工排出交错的 ABA 演示里,A 的 CAS 返回"成功"并把早已弹走的节点接回链表;4 线程随机对拍 30 万步,无锁栈重复取走 0 个(结构正确)却比有锁栈慢 2.07 倍(58.5ms vs 28.3ms),而单线程无竞争时它反而快 1.45 倍(12.59 vs 18.25 ns/次)。
实测:无保护的自增丢掉 70.7% 的更新,但 -Wall -Wextra 一声不响、MinGW 连 -fsanitize=thread 都链不上;锁的 uncontended 单价 16.65ns,把计算移出锁外吞吐快 5.5 倍;try_lock_for(10µs) 实际每次卡 15.9 毫秒。
实测:std::async 每次派生 53.3 微秒,500 个 0.1ms 任务不 get 只靠 future 析构就花 110.3ms(等于串行);launch::deferred 的任务在 get 之前一次都没执行;actor 邮箱逐条投递 0.091µs/条、攒 1000 条一批投 0.023µs/条;COW 快照要读段长到 800 次累加才反超 mutex(1.70x)。
实测:MinGW 上 sizeof(std::thread)=8 且 native_handle() 与 pthread_self 是同一个值;PTHREAD_CREATE_DETACHED 在这里等于 4 而不是 1;pthread_setschedparam(SCHED_FIFO) 返回 129;三种生命周期误用的退出码都是 0x00000003。
实测:MinGW 上 shared_mutex 无竞争单价是 std::mutex 的 5–5.7 倍,8 线程纯读时反而慢 9 倍,读临界区长到 1600 次累加才追平;自旋锁无竞争比 mutex 快 45%,多来 4 个可运行线程就反过来慢 3.6 倍;call_once 已完成路径只要 3.11 纳秒。
实测:100 万个待执行任务吃掉 35.30MB(每任务 36 字节);200 个 1ms 的 CPU 任务在 P=8 时 38.1ms 跑完、P=12 反而退回 50.9ms,而 120 个阻塞任务加到 16 线程只用 121.6ms;优雅关闭能兑现"一个不丢"(2000 个里 1865 个还在排队),detach 之后 400 个任务只完成 0 个。
实测:唤醒一次线程交接 11.35 微秒,原子自旋交接 61 纳秒,同一个逻辑处理器塞 2 个线程吞吐只涨 1%;一个空闲线程 37KB 提交内存,一个空进程 3.83MB 加 84 个句柄、启动 16.74 毫秒。
空类为什么占 1 字节、成员按声明顺序构造而不是初始化列表顺序、移动构造少写一个 noexcept 就让 vector 扩容多拷一千次——类的骨架规则一次讲清。