1. 为什么我们需要多线程同步?
当我在十年前第一次尝试用C++写多线程程序时,遇到了一个经典问题:两个线程同时往控制台打印信息,结果输出完全乱套了。这就是典型的"竞态条件"(Race Condition)问题,也是多线程编程中最常见的坑之一。
多线程同步的本质,是要解决多个执行流对共享资源的访问冲突。想象一下十字路口的交通信号灯——没有同步机制的多线程就像没有红绿灯的十字路口,迟早会发生"数据撞车"。在C++中,我们主要通过以下几种机制来实现线程同步:
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. C++标准库中的同步原语
2.1 std::mutex:最基础的互斥锁
互斥锁(Mutex)是最直观的同步机制,就像洗手间的门锁——一次只允许一个人使用。C++11引入的std::mutex用法很简单:
cpp复制std::mutex mtx;
void safe_print(const std::string& msg) {
mtx.lock();
std::cout << msg << std::endl;
mtx.unlock();
}
但这里有个大坑:如果在lock和unlock之间抛出了异常,锁就永远不会被释放!所以更安全的做法是使用std::lock_guard:
cpp复制void safer_print(const std::string& msg) {
std::lock_guard<std::mutex> guard(mtx);
std::cout << msg << std::endl;
} // 这里guard析构时会自动释放锁
重要经验:永远不要手动调用lock/unlock,应该用RAII包装器。我在项目中最常看到的多线程bug就是忘记解锁。
2.2 std::unique_lock:更灵活的锁管理
std::unique_lock比lock_guard更灵活,支持延迟锁定、条件变量配合等高级用法:
cpp复制std::mutex mtx;
std::unique_lock<std::mutex> lock(mtx, std::defer_lock); // 不立即锁定
// ...其他操作...
lock.lock(); // 需要时再锁定
这
