一、tha.jion 和 tha.deatch1. 先讲两个函数的区别tha.join();主线程等着子线程跑完再继续往下走主线程会卡在这里等子线程结束安全、不会出错tha.detach();将子线程从主线程分离主线程不再管理子线程各自独立运行主线程继续往下跑可能先跑完、直接退出程序子线程变成后台线程守护线程继续自己跑极容易出 bug2. 放到代码里会发生什么灾难Int a(10); std::thread tha(funa, a); tha.detach(); // 这里改成detach // 主线程直接往下跑不等子线程 cout main--------------- endl; a.Print(); return 0;结果 1主线程可能先跑完直接销毁 a主线程退出 → 局部变量a被析构但子线程还在跑还在使用已经被销毁的对象→悬空对象、非法访问、程序直接崩溃结果 2输出乱序你会看到输出乱跳main--------------- 10 Creat Int:... Copy Int:...主线程先打印完了子线程才开始跑。结果 3子线程还没跑完程序已经结束子线程直接被操作系统强行杀死。二、条件变量condition_variable它就是 C11 专门给线程用的 “等待 唤醒” 工具1. 它到底是干嘛的一句话让一个线程停下来等直到另一个线程喊它它才继续跑。你可以把它理解成线程 A我等着你弄好了叫我线程 B我弄好了喊你继续这就是condition_variable。2. 它必须配合谁一起用必须配合 std::mutex 互斥锁一起用不能单独用因为等待的时候要解锁唤醒的时候要加锁条件变量自己不会锁必须靠mutex。3. 最核心的 3 个功能wait()线程停下来阻塞等待→ 自动解锁 → 等着被唤醒notify_one()唤醒一个正在等待的线程notify_all()唤醒所有正在等待的线程三、惊群现象惊群现象是指使用notify_all()时一次性唤醒所有等待线程但只有一个线程能真正工作其余线程白唤醒、白抢锁造成 CPU 资源浪费。在多线程轮流打印场景中notify_one可能唤醒错误线程 →死锁notify_all会产生惊群 →但安全、不会死锁所以必须用notify_all。四、notify_one和notify_all1.对比notify_one()只唤醒1个正在 wait 的线程优点无惊群效率高缺点可能唤醒 “错误线程” → 死锁notify_all()唤醒所有正在 wait 的线程优点绝对安全不会死锁缺点惊群效应大量线程抢锁浪费 CPU2.什么时候用哪个用 notify_one 的场景生产者消费者一对多用 notify_all 的场景:多线程轮流打印 / 条件与线程绑定 / 程序退出