C++11内存模型与数据竞争检测
请解释C++11内存模型如何定义数据竞争(Data Race),以及如何用工具检测。
回答
孤独的心
C++11标准定义:两个线程同时访问同一非原子变量,至少有一个是写操作,且没有happens-before关系,即为数据竞争——导致未定义行为。
示例:
int x = 0;
// 线程1: x = 1; // 写
// 线程2: cout << x; // 读,无同步,数据竞争 UB
检测工具:
- ThreadSanitizer(TSan):GCC/Clang的运行时工具
g++ -fsanitize=thread -g -O1 program.cpp - Helgrind:Valgrind的线程错误检测器
- 静态分析:Clang-Tidy、Cppcheck
预防原则:
- 所有共享可变数据用
std::atomic或std::mutex保护 - 避免裸全局变量
- 使用RAII锁管理同步
- 尽量减少共享数据的写操作