C++ 多线程与并发 这是现代 C 进阶最硬核、最值钱的知识点我用清晰、实战、不晦涩的方式给你讲透学完就能写高并发代码。一、先搞懂为什么要用多线程同时干多件事后台下载 界面操作利用多核 CPU提升程序速度避免阻塞一个卡住不影响整体代价线程安全、数据竞争、死锁 —— 必须学会控制。二、C 多线程核心 5 大组件必须背C11 之后自带线程库thread跨平台不用再写 pthread。1. std::thread —— 创建线程cpp运行#include iostream #include thread using namespace std; void func() { cout 子线程运行\n; } int main() { thread t(func); // 创建并启动线程 t.join(); // 等待线程结束必须写 return 0; }两个关键函数join()主线程等待子线程完成detach()分离线程后台运行谨慎使用容易出坑2. std::mutex —— 互斥锁解决数据竞争多线程同时修改同一个变量 数据混乱 崩溃必须用锁保护。cpp运行#include mutex mutex mtx; int cnt 0; void add() { for (int i 0; i 100000; i) { mtx.lock(); // 加锁 cnt; // 安全修改 mtx.unlock(); // 解锁 } }3. lock_guard /unique_lock —— 自动锁RAII手动 lock/unlock 极易忘写导致死锁现代 C 一律用自动锁。cpp运行void add() { mtx.lock(); // 不推荐 ... mtx.unlock(); // 推荐写法 lock_guardmutex lock(mtx); // 构造加锁析构自动解锁 }unique_lock更强大可以临时解锁可以延迟加锁配合条件变量使用4. std::condition_variable —— 条件变量线程同步用于生产者 - 消费者模型一个线程等通知另一个线程发通知。cpp运行condition_variable cv; mutex mtx; bool ready false; void consumer() { unique_lockmutex lock(mtx); cv.wait(lock, []{ return ready; }); // 等待信号 cout 开始消费\n; } void producer() { { lock_guardmutex lock(mtx); ready true; } cv.notify_one(); // 唤醒一个等待线程 }5. std::atomic —— 原子变量无锁并发对简单变量int/bool操作不加锁也能线程安全性能极高。cpp运行#include atomic atomicint cnt 0; void add() { for (int i 0; i 100000; i) { cnt; // 原子操作安全无锁 } }三、多线程必学生产者 - 消费者模型这是面试 项目最常考模型。cpp运行#include queue queueint q; mutex mtx; condition_variable cv; void producer() { for (int i 0; i 10; i) { lock_guardmutex lock(mtx); q.push(i); cv.notify_one(); } } void consumer() { while (true) { unique_lockmutex lock(mtx); cv.wait(lock, []{ return !q.empty(); }); int val q.front(); q.pop(); lock.unlock(); cout 消费 val endl; } }四、高级并发async /future异步任务不用手动创建线程直接获取返回值。cpp运行#include future int func() { return 10; } int main() { futureint f async(func); int res f.get(); // 等待结果 return 0; }五、多线程 3 大坑必须避开1. 死锁Deadlock两个线程互相等对方释放锁程序卡死。避免方法所有线程按固定顺序加锁尽量用lock_guard不要长时间持有锁2. 数据竞争未加锁同时读写变量。避免锁 or 原子变量3. 悬空指针 / 引用线程使用了已销毁的变量。避免确保生命周期安全。六、现代 C 并发最佳实践黄金法则优先用 atomic不加锁性能最高必须加锁时用 lock_guard/unique_lock少用 detach ()尽量用 join ()共享变量必须保护复杂同步用条件变量高并发用线程池