C_condition_variable条件变量C11 引入的线程同步工具用于实现等待-通知机制。当某个条件不满足时线程可以阻塞等待当条件满足时另一个线程发出通知将其唤醒。核心组成条件变量必须与互斥锁配合使用通常包含三个要素std::mutex mx;// 互斥锁保护共享数据std::condition_variable cv;// 条件变量负责等待和通知boolconditionfalse;// 共享条件可以是任意类型的条件核心API等待方wait()wait() 有三种形式// 形式一无限等待可能虚假唤醒voidwait(std::unique_lockstd::mutexlock);// 形式二带谓词的无限等待自动处理虚假唤醒templateclassPredicatevoidwait(std::unique_lockstd::mutexlock,Predicate pred);// 形式三带超时的等待templateclassRep,classPeriodstd::cv_statuswait_for(std::unique_lockstd::mutexlock,conststd::chrono::durationRep,Periodrel_time);// 形式四带谓词和超时的等待templateclassRep,classPeriod,classPredicateboolwait_for(std::unique_lockstd::mutexlock,conststd::chrono::durationRep,Periodrel_time,Predicate pred);wait()内部行为自动释放锁 → 让其他线程有机会修改共享条件线程进入阻塞休眠 → 不消耗 CPU被唤醒后自动重新获取锁 → 保证后续代码的线程安全函数返回通知方notifyvoidnotify_one();// 唤醒一个等待线程随机选择voidnotify_all();// 唤醒所有等待线程虚假唤醒Spurious Wakeup这是一个非常重要的概念线程可能在没有被通知的情况下意外醒来这是操作系统层面的行为C 标准允许这种情况发生。虚假唤醒错误写法(使用if)std::unique_lockstd::mutexlock(mx);if(!ready){// 虚假唤醒时条件仍为false但已经跳出了ifcv.wait(lock);}// 继续执行——但条件其实不满足虚假唤醒正确写法(用while)std::unique_lockstd::mutexlock(mx);while(!ready){// 虚假唤醒后重新检查条件不满足则继续等待cv.wait(lock);}// 能走到这里说明条件一定满足简洁语法带谓词的 waitstd::unique_lockstd::mutexlock(mx);cv.wait(lock,[]{returnready;});// 等价于上面的 while 循环示例#includeiostream#includethread#includecondition_variable#includemutexusingnamespacestd;mutex mx;condition_variable scv;boolreadyfalse;voidprint_id(intid){unique_lockmutexlck(mx);while(!ready)scv.wait(lck);// 如果标志位为false则阻塞当前线程直到标志位为true才继续执行coutthread idendl;}voidRunFunc(){unique_lockmutexlck(mx);readytrue;// 设置标志位为true表示线程可以继续执行scv.notify_all();// 唤醒所有等待的线程}intmain(){thread thrs[5];for(inti0;i5;i){thrs[i]thread(print_id,i);}cout5 threads ready to race...\n;RunFunc();for(autot:thrs){// 遍历线程数组中的每一个线程t.join();}return0;}常见陷阱忘记加锁就修改条件 → 数据竞争。先notify再改条件 → 等待方醒来发现条件不满足继续等待可能永久等待。用if代替while→ 虚假唤醒导致逻辑错误。用lock_guard代替unique_lock→ 编译报错wait()要求unique_lock。notify时仍持有锁 → 被唤醒的线程立即阻塞性能下降。总结std::condition_variable的本质就是一个线程间的消息通知机制等待方wait()→ 释放锁 休眠 被唤醒 重新加锁。通知方改条件 →notify_one() / notify_all()。永远用while或带谓词的wait()来防止虚假唤醒。必须配合std::unique_lockstd::mutex使用。c越学越不懂了呀需借助AI分析别人的c代码T.T~