关于C++层Thread的threadLoop的问题

关于C++层Thread的threadLoop的问题

时间  2020-03-20

标签 关于 c++  thread threadloop 问题 栏目 C&C++ 繁體版

原文   https://my.oschina.net/u/920274/blog/3194864

相关类
Threads.cpp
threads.h
Thread.handroid

在C++层的输入处理类中碰到一个线程相关的问题
1:InputReaderThread读取线程及InputDispatcherThread派发线程是如何去执行threadLoop方法的?
2:事件读取及派发线程确定是一个循环线程,由于它要持续的接收并派发驱动层的触摸事件,threadLoop如何循环?函数

在Native层实现一个Thread类的派生类,Thread中有一个虚方法,派生类需实现oop

virtual bool        threadLoop()

在实现该方法时,注意如下规则
当返回true时,若是requestExit没有被调用,则threadLoop会再次调用
当返回false时,线程退出this

Thread的run方法主要功能是在C层建立线程
if (mCanCallJava) {
      res = createThreadEtc(_threadLoop, this, name, priority, stack, &mThread);
} else {
      res = androidCreateRawThreadEtc(_threadLoop, this, name, priority, stack, &mThread);
}

当mCanCallJava是true时,createThreadEtc定义在AndroidThreads.h中的内联函数,调用androidCreateThreadEtcspa

int androidCreateThreadEtc(android_thread_func_t entryFunction,
                            void *userData,
                            const char* threadName,
                            int32_t threadPriority,
                            size_t threadStackSize,
                            android_thread_id_t *threadId)
{
    return gCreateThreadFn(entryFunction, userData, threadName,threadPriority, threadStackSize, threadId);
}

gCreateThreadFn默认时等于androidCreateRawThreadEtc
当mCanCallJava是false时,调用androidCreateRawThreadEtc,建立线程线程

int result = pthread_create(&thread, &attr,(android_pthread_entry)entryFunction, userData);

pthread_create是Linux建立线程的方法,并执行entryFunction,对应的是_threadLoop
综上,在Thread类的run方法执行后,会调用底层库libpthread的方法pthread_create建立线程,并执行回调方法_threadLoop。code

_threadLoop控制threadLooper的循环
do {
        bool result;
        if (first) {
            first = false;
            self->mStatus = self->readyToRun();
            result = (self->mStatus == NO_ERROR);
            if (result && !self->exitPending()) {
                result = self->threadLoop();
            }
        } else {
            result = self->threadLoop();
        }

        {
        Mutex::Autolock _l(self->mLock);
        if (result == false || self->mExitPending) {//当result 为false或者result 为true且mExitPending时,退出循环,退出线程
            self->mExitPending = true;
            self->mRunning = false;
           
            self->mThread = thread_id_t(-1);
       
            self->mThreadExitedCondition.broadcast();
            break;
        }
        }

        strong.clear(); 
        strong = weak.promote();
    } while(strong != 0);

threadLooper派生类返回true,可实现线程循环执行threadLooper方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
【RT-Thread作品秀】基于RT-Thread的姿态解算控制平台设计作者:黄国盛 概述是一个姿态解算算法验证平台以及控制算法验证平台 实现步骤: 使用CubeMax HAL库开发; 使用Python project_generator生成工程; 精简RTT Master内核并加入C++支持; 配置调试接口; 构建C/C++混合编程框架; 硬件IIC驱动GY-86传感器驱动; MATLAB设计IIR Butterworth四阶低通滤波器; 传感器校准; Mahony互补滤波算法 实现姿态解算; 加入mavlink/私有协议、UDP/USB上传数据到PC; 通过MATLAB/STM32验证和比较各种算法; 搭建单轴单桨一维角度控制平台; …… 开发环境硬件: 碳纤管碳纤桨电机座、电机电调电源、ART_Pi、GY86、按键模块、硅胶线…… RT-Thread版本: Master 4.0.3 开发工具及版本: STM32CubeMX 6.0.1、IARforARM8.32.1、BeyondCompare4、MATLAB R2019b、VSCode、SmartGit20.1.5、匿名飞控地面站-0512…… RT-Thread使用情况概述Pin、serial、cplusplus、time、finsh 硬件框架ART_Pi、GY86、按键模块、电调…… 软件框架说明C/C++混合编程,进程和Loop Schedule结合 软件模块说明核心部分:关于GY86的驱动以及姿态解算的Mahony 演示效果演示视频: 比赛感悟4/11/2020Will_Watson 关于AHRS,卡尔曼滤波或互补滤波理解起来 简单但实施难度较大因为很多参数有待测定; 发现各开源项目用的最多的是Mahony算法,关于它的PI部分的本质着实难以理解; 当发现BP神经网络逼近好像可以和卡尔曼滤波一样,就当成滤波器,而且它还可以是一个逼近式的滤波器,免不了一番测试比较; 而后查看Madgwick原文中提到“梯度下降法”,瞬间明白了它的根源和本质; 当学习BP神经网络逼近的时候的思考流程如下: 逼近的需求来源是什么?可能是为了预测系统下一个输出,为了做前馈控制? 预测 ——> 观测器 ——> 逼近式滤波器??? 神经逼近网络的特性有哪些?不具有长时记忆,短时记忆即可以说只具有最近时刻原系统的逼近特性; 尝试检测滤波特性,从这个角度理解逼近网络也是一个不断修正的预估观测器或者说卡尔曼滤波器 从执行流程/滤波效果上 分析一维卡尔曼滤波 和 NNI-BP逼近一维非线性系统的 区别: 卡尔曼滤波流程:先验估计值——>先验估计方差——>依据各方差融合传感器数据做后验估计——>更新后验估计方差; NNI-BP逼近流程: 由网络前状态和新输入直接计算输出——>与原系统输出比较修正网络状态(是为了下一次直接获得预估输出); 注:把原系统输出当成需滤波数据;把神经网络输出当成滤波后数据 卡尔曼滤波没有阶数的概念,而NNI-BP逼近的滤波特性具有一定延迟 卡尔曼滤波器的主要控制参数(基于现实过程噪声和观测噪声)不可控,转移矩阵协方差矩阵需测得; NNI-BP逼近 的主要 控制参数(学习速率和动量因子)可控 即滤波效果可调节,逼近系统特性; 也有一部分“内闭环软拟硬输入输出”思想 当然算法的表现依然可以看起来就是加减乘除那么简单,双重卡尔曼看起来和做起来可能没那么友好;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值