如何使用C++11的两个线程连续打印12 12 12......
C++11双线程交替打印"12 12..."的正确实现方案
原代码存在的问题
func1没有等待逻辑,会持续抢占锁疯狂打印"1",仅靠修改flag和通知无法和func2形成交替执行,最终输出会是大量"1"夹杂少量"2",完全不符合预期。func2打印完成后未修改flag状态,后续等待逻辑会出现异常,无法稳定触发交替。
修正后的实现代码
#include <iostream> #include <thread> #include <condition_variable> #include <mutex> using namespace std; mutex m; condition_variable cv; // flag为false时,执行打印"1"的线程;flag为true时,执行打印"2"的线程 bool flag = false; void print1() { while (true) { unique_lock<mutex> lock(m); // 等待直到允许打印"1"的条件成立 cv.wait(lock, []{ return !flag; }); cout << "1"; // 更新状态,通知打印"2"的线程可以执行 flag = true; cv.notify_one(); } } void print2() { while (true) { unique_lock<mutex> lock(m); // 等待直到允许打印"2"的条件成立 cv.wait(lock, []{ return flag; }); cout << "2 "; // 更新状态,通知打印"1"的线程可以执行 flag = false; cv.notify_one(); } } int main() { thread t1(print1); thread t2(print2); t1.join(); t2.join(); return 0; }
关键实现要点
- 条件变量的规范使用:两个线程都通过
cv.wait()等待自身的执行条件,wait()会自动释放锁并阻塞,直到条件满足时重新获取锁,避免了手动解锁时机错误导致的问题。 - 状态同步机制:每个线程完成打印后,必须修改
flag状态并通知对方线程,确保执行权在两个线程之间交替传递。 - 锁的生命周期管理:用
unique_lock自动管理锁的获取和释放,保证在等待、打印、修改状态的整个过程中,锁的状态正确,避免并发修改共享变量flag导致的逻辑混乱。
内容的提问来源于stack exchange,提问作者praveen
相关产品推荐
相关产品推荐

