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

C++多线程异常求助:线程2无法正常执行

问题解决:线程交替执行的修正方案

原代码的核心问题是线程2仅执行一次锁获取操作后就结束运行,而线程1在循环中反复获取释放锁,导致线程2无法持续响应锁的释放。同时满足线程1保留无限循环结构的要求,以下是修正后的实现:

关键修改点

  • 新增原子布尔变量stopFlag,用于安全终止线程1的无限循环(避免程序无法退出)
  • 线程2改为循环结构,持续尝试获取锁,确保每次线程1释放锁时都有机会执行
  • 调整线程内的休眠时间,优化交替执行的观测效果

修正后的代码

#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
#include <atomic>

std::mutex myMutex;
std::atomic<bool> stopFlag(false); // 原子变量确保线程间安全访问

void thread1Function() {
    std::cout << "Thread 1 started." << std::endl;
    while (!stopFlag) { // 无限循环,通过标志位控制退出
        {
            std::lock_guard<std::mutex> lock(myMutex);
            std::cout << "t1" << std::endl;
        }
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }
    std::cout << "Thread 1 finished." << std::endl;
}

void thread2Function() {
    std::cout << "Thread 2 started." << std::endl;
    while (!stopFlag) { // 循环尝试获取锁,响应线程1的锁释放
        {
            std::lock_guard<std::mutex> lock(myMutex);
            std::cout << "t2" << std::endl;
        }
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }
    std::cout << "Thread 2 finished." << std::endl;
}

int main() {
    std::thread t1(thread1Function);
    std::thread t2(thread2Function);

    // 主线程等待5秒后触发退出标志
    std::this_thread::sleep_for(std::chrono::seconds(5));
    stopFlag = true;

    t1.join();
    t2.join();

    return 0;
}

代码说明

  1. 原子退出标志:std::atomic<bool>保证线程间对标志位的读写操作是原子的,避免数据竞争导致的未定义行为。
  2. 双循环结构:线程1和线程2都通过while(!stopFlag)维持运行,线程2不再是一次性执行,而是持续尝试获取锁。
  3. 锁的作用域:使用std::lock_guard在代码块结束时自动释放锁,确保每次打印操作完成后锁会被释放,让另一个线程有机会获取。
  4. 休眠时间调整:将线程2的休眠时间从1秒改为100毫秒,让两个线程的执行频率接近,更容易观测到交替打印t1和t2的效果。

内容的提问来源于stack exchange,提问作者Charlie_57

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 09:57:14