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

C++多线程问题:为何我的线程完全无法运行?

多线程变量同步问题分析与解决方案

你的代码存在的核心问题

  1. 内存可见性缺失:全局变量a被两个线程读写,但没有任何同步机制。现代CPU会将变量缓存到寄存器或本地缓存中,Output线程可能一直读取缓存里的旧值,无法感知Input线程对a的更新。
  2. 潜在竞态条件:虽然int类型的读写在多数平台是原子操作,但C++标准并不保证这一点。极端情况下,当Input线程正在写入a的同时Output线程读取,可能得到不完整的中间值。
  3. Output线程无节制输出:死循环疯狂输出不仅占用极高CPU,而且变量更新后,新值会被大量旧值输出淹没,根本看不到同步效果。
  4. 线程未正确收尾:main函数创建线程后直接退出,会导致整个进程终止,线程被强制杀死,行为完全不可控。

修正后的实现方案

方案1:使用C++原子变量(简单高效)

原子变量可以直接保障内存可见性和原子操作,无需手动加锁:

#include <iostream>
#include <pthread.h>
#include <atomic>
#include <unistd.h>

std::atomic<int> a(0);

void* Input(void* arg){
    while(true){
        int input_val;
        std::cin >> input_val;
        a.store(input_val, std::memory_order_release);
        std::cout << std::endl;
    }
    return nullptr;
}

void* Output(void *arg){
    int last_val = a.load(std::memory_order_acquire);
    while(true){
        int current_val = a.load(std::memory_order_acquire);
        if(current_val != last_val){
            std::cout << "当前值:" << current_val << std::endl;
            last_val = current_val;
        }
        usleep(100000); // 休眠0.1秒,降低CPU占用
    }
    return nullptr;
}

int main(){
    pthread_t GetInput;
    pthread_create(&GetInput, NULL, Input, NULL);
    pthread_t GetOutput;
    pthread_create(&GetOutput, NULL, Output, NULL);
    
    pthread_join(GetInput, nullptr);
    pthread_join(GetOutput, nullptr);
    return 0;
}

方案2:使用互斥锁+条件变量(精准唤醒)

这种方案让Output线程只在变量更新时被唤醒,避免无效循环,更高效:

#include <iostream>
#include <pthread.h>

int a = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

void* Input(void* arg){
    while(true){
        int input_val;
        std::cin >> input_val;
        pthread_mutex_lock(&mutex);
        a = input_val;
        pthread_mutex_unlock(&mutex);
        pthread_cond_signal(&cond); // 通知Output线程更新
        std::cout << std::endl;
    }
    return nullptr;
}

void* Output(void *arg){
    while(true){
        pthread_mutex_lock(&mutex);
        pthread_cond_wait(&cond, &mutex); // 等待更新信号
        std::cout << "当前值:" << a << std::endl;
        pthread_mutex_unlock(&mutex);
    }
    return nullptr;
}

int main(){
    pthread_t GetInput;
    pthread_create(&GetInput, NULL, Input, NULL);
    pthread_t GetOutput;
    pthread_create(&GetOutput, NULL, Output, NULL);
    
    pthread_join(GetInput, nullptr);
    pthread_join(GetOutput, nullptr);
    
    pthread_mutex_destroy(&mutex);
    pthread_cond_destroy(&cond);
    return 0;
}

参考资料

  • 《C并发编程实战》:全面讲解C多线程核心概念,包括内存模型、原子操作、同步机制等,是入门多线程的经典读物。
  • POSIX线程(pthread)官方文档:系统学习pthread库的API用法,掌握互斥锁、条件变量等工具的正确使用方式。
  • 《操作系统概念》:理解多线程同步的底层原理,比如竞态条件、临界区、内存可见性等核心概念,从根源解决问题。
  • C标准文档并发章节:了解C对多线程的规范要求,明确原子类型、线程同步的标准行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 22:12:24