You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:15:36