bug:进程可调用函数而子线程调用报错

在调试摄像头时遇到问题:在主进程里调用下述函数能够成功,但在子线程里创建时总是失败,错误打印为 sched: RT throttling activated。

UniqueObj<OutputStream> outputStream(iCaptureSession->createOutputStream(streamSettings.get()));

原因为子线程的运行策略导致,通过下述函数可以查看和设置当前线程的运行策略。

    int my_policy;
    struct sched_param my_param;
    //my_param.sched_priority = 99;
    if(pthread_setschedparam(pthread_self(), SCHED_OTHER, &my_param) != 0)//线程运行时设置策略和优先值
    {
        RPTERR("v4l2_camera_start_stop::pthread_setschedparam failed\n");
    }

    pthread_getschedparam(pthread_self(), &my_policy, &my_param);
    RPTWRN("v4l2_camera_start_stop::thread_routine running at %s/%d\n",\ (my_policy == SCHED_FIFO ? "FIFO" : (my_policy == SCHED_RR ? "RR"\ : (my_policy == SCHED_OTHER ? "OTHER" : "unknown"))), my_param.sched_priority);

系统线程的运行策略为SCHED_FIFO,通过验证发现SCHED_FIFO 和SCHED_RR这两种抢占实时策略都不行,而SCHED_OTHER 可以,主进程即为该策略。

分析:由于该函数outputStream()写的不好,当使用抢占策略时,耗尽了系统资源,系统因自我保护而报错,写代码时无限循环应该加一些sleep,防止资源耗尽,SCHED_OTHER为非实时策略,优先级低。

转载于:https://www.cnblogs.com/eleclsc/p/10525730.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值