多线程程序随机出现数据异常,复现概率极低,单步调试时又完全正常,很难定位到问题根源。这类问题大多来自共享变量的无保护读写,不用靠运气复现排查。

1. 加std::mutex锁保护
所有多线程读写的共享变量,访问前先加互斥锁。
同一时间只允许一个线程操作变量,彻底避免多个线程同时写入,打断数据更新过程产生的不一致。
2. 用原子变量替代普通变量
针对计数、标志位这类简单共享变量,直接用std::atomic封装。
无需手动加锁,硬件层面保证读写操作的原子性,不会出现半更新的中间状态,性能也比互斥锁更高。
3. 开启线程检测工具
编译时添加-fsanitize=thread选项,启用线程 sanitizer。
运行程序后,工具会直接标出所有存在数据竞争的代码行,不用靠随机复现就能定位所有未保护的共享访问点。
4. 减少共享变量数量
尽量用线程局部存储TLS存放线程私有数据。
从设计层面降低多线程共享数据的场景,从根源上减少数据竞争的可能性,大幅降低后续维护的复杂度。
本文凡亿教育原创文章,转载请注明来源!
暂无评论