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

运行含随机生成器的双线程函数时出现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;
}

修复说明

  1. 线程资源处理:添加t1.join()和t2.join(),让主线程等待子线程完成(由于子线程是无限循环,主线程会一直阻塞,避免进程提前终止)。如果希望子线程后台运行,也可以替换为t1.detach()和t2.detach(),但需注意子线程的资源生命周期管理。
  2. 随机数优化:将std::mt19937和分布对象移到循环外部,仅初始化一次,每次循环只需调用分布对象生成随机数,既提升效率,也保证了伪随机序列的质量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:52:32