运行含随机生成器的双线程函数时出现Debug调试错误
线程退出代码3(0x3)的排查与修复
问题根源
调试器提示的线程退出代码3(0x3),本质是主线程提前终止时强制杀死了未处理的子线程。你的main函数创建t1和t2后直接return 0,进程会立即终止,所有未通过join或detach处理的子线程会被操作系统强制结束,调试器因此抛出该退出码。
额外的代码优化点
你的随机数生成逻辑存在低效问题:
- 每个循环都重新实例化
std::random_device、std::mt19937和分布对象,既浪费系统资源(random_device会消耗系统熵池),也无法生成高质量的伪随机序列(伪随机生成器需要持续迭代才能输出均匀序列)。
修复后的代码
#include <iostream> #include <random> #include <thread> #include <chrono> #include <iomanip> void func1 () { // 随机数组件移到循环外,仅初始化一次 std::random_device iRNG1; std::mt19937 rRNG1(iRNG1()); std::uniform_int_distribution<int> rd1 (0, 6); while (true) { int num1 {rd1(rRNG1)}; std::cout << std::setw(10) << "Thread1: " << num1 << std::endl; std::this_thread::sleep_for (std::chrono::milliseconds (500)); } }; void func2 () { std::this_thread::sleep_for (std::chrono::milliseconds (250)); // 随机数组件移到循环外 std::random_device iRNG2; std::mt19937 rRNG2(iRNG2()); std::uniform_int_distribution<int> rd2 (2,4); while (true) { int num2 {rd2(rRNG2)}; std::cout << std::setw(10) << "Threaddddddd2: " << num2 << std::endl; std::this_thread::sleep_for (std::chrono::milliseconds (500)); } }; int main() { std::thread t1 (func1); std::thread t2 (func2); // 让主线程等待子线程执行(子线程是死循环,主线程会一直阻塞) t1.join(); t2.join(); return 0; }
修复说明
- 线程资源处理:添加
t1.join()和t2.join(),让主线程等待子线程完成(由于子线程是无限循环,主线程会一直阻塞,避免进程提前终止)。如果希望子线程后台运行,也可以替换为t1.detach()和t2.detach(),但需注意子线程的资源生命周期管理。 - 随机数优化:将
std::mt19937和分布对象移到循环外部,仅初始化一次,每次循环只需调用分布对象生成随机数,既提升效率,也保证了伪随机序列的质量。
内容的提问来源于stack exchange,提问作者RedRainingBlood
相关产品推荐
相关产品推荐

