C++多线程问题:为何我的线程完全无法运行?
多线程变量同步问题分析与解决方案
你的代码存在的核心问题
- 内存可见性缺失:全局变量
a被两个线程读写,但没有任何同步机制。现代CPU会将变量缓存到寄存器或本地缓存中,Output线程可能一直读取缓存里的旧值,无法感知Input线程对a的更新。 - 潜在竞态条件:虽然
int类型的读写在多数平台是原子操作,但C++标准并不保证这一点。极端情况下,当Input线程正在写入a的同时Output线程读取,可能得到不完整的中间值。 - Output线程无节制输出:死循环疯狂输出不仅占用极高CPU,而且变量更新后,新值会被大量旧值输出淹没,根本看不到同步效果。
- 线程未正确收尾: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
相关产品推荐
相关产品推荐

