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

