一、先问一个工程问题
你有一个共享容器:
std::vector<int> data;
两个线程同时往里面 push_back()。
会发生什么?
你可能会说:
vector 不是自动扩容的吗?
是的,但:
vector 不是线程安全的。
内部会:
- 修改 size
- 可能 realloc
- 移动内存
如果两个线程同时写:
未定义行为。
二、资源保护的本质
并发系统里最重要一句话:
不是'给代码加锁',而是'给资源加保护策略'。
资源 = 被多个线程共享的数据。
三、什么是临界区(Critical Section)
临界区是:
访问共享资源的代码区域。
例如:
data.push_back(1);
这一行,就是临界区。
四、最原始写法(危险)
std::mutex mtx;
void task() {
mtx.lock();
data.push_back(1);
mtx.unlock();
}
看起来没问题。
但如果中间抛异常?
mtx.lock();
throw std::runtime_error("error");
mtx.unlock(); // 永远执行不到
锁永远不释放。
其他线程:
永久阻塞(死锁)。
五、C++ 的核心思想:RAII
RAII = Resource Acquisition Is Initialization
意思:
资源的获取与对象生命周期绑定。
锁对象在构造时加锁,在析构时自动解锁。
这就是:
std::lock_guard

