SylixOS pthread_join退出

2024-09-07 15:32
文章标签 join 退出 pthread sylixos

本文主要是介绍SylixOS pthread_join退出,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 问题描述

在移植中间件过程中,在SylixOS下调用pthread_join时,如果线程在pthread_join等待之前结束,则线程返回无效线程错误值。在Linux下这种调用会正常返回。两种实现是有差别的,实现的原理分别如下。

2 函数实现机制

2.1 实现机制

在SylixOS下调用pthread_join时,如果线程在pthread_join等待之前结束,线程返回无效线程错误标志,具体实现如程序清单 2.1所示。函数在实现中会先检测线程是否有效,如果线程无效则直接返回线程无效的错误。

程序清单 2.1 SylixOS pthread_join实现机制

LW_API

ULONG  API_ThreadJoin (LW_OBJECT_HANDLE  ulId, PVOID  *ppvRetValAddr)

{

    REGISTER UINT16                usIndex;

    REGISTER PLW_CLASS_TCB         ptcbCur;

    REGISTER PLW_CLASS_TCB         ptcb;

   

    usIndex = _ObjectGetIndex(ulId);

   

    if (LW_CPU_GET_CUR_NESTING()) {   /*  不能在中断中调用            */

        _DebugHandle(__ERRORMESSAGE_LEVEL, "called from ISR.\r\n");

        _ErrorHandle(ERROR_KERNEL_IN_ISR);

        return  (ERROR_KERNEL_IN_ISR);

    }

   

    LW_TCB_GET_CUR_SAFE(ptcbCur);

   

#if LW_CFG_ARG_CHK_EN > 0

    if (!_ObjectClassOK(ulId, _OBJECT_THREAD)) {/*  检查 ID 类型有效性      */

        _ErrorHandle(ERROR_KERNEL_HANDLE_NULL);

        return  (ERROR_KERNEL_HANDLE_NULL);

    }

   

    if (_Thread_Index_Invalid(usIndex)) {    /*  检查线程有效性              */

        _ErrorHandle(ERROR_THREAD_NULL);

        return  (ERROR_THREAD_NULL);

    }

#endif

 

    __THREAD_CANCEL_POINT();       /*  测试取消点                  */

   

    __KERNEL_ENTER();                 /*  进入内核                    */

    if (_Thread_Invalid(usIndex)) {

        __KERNEL_EXIT();              /*  退出内核                    */

        _ErrorHandle(ERROR_THREAD_NULL);

        return  (ERROR_THREAD_NULL);

    }

   

    ptcb = _K_ptcbTCBIdTable[usIndex];

   

    if (ptcb == ptcbCur) {          /*  不能阻塞自己                */

        __KERNEL_EXIT();             /*  退出内核                    */

        _DebugHandle(__ERRORMESSAGE_LEVEL, "thread join self.\r\n");

        _ErrorHandle(ERROR_THREAD_JOIN_SELF);

        return  (ERROR_THREAD_JOIN_SELF);

    }

       

    if (ptcb->TCB_bDetachFlag) {

        __KERNEL_EXIT();             /*  退出内核                    */

        _ErrorHandle(ERROR_THREAD_DETACHED);

        return  (ERROR_THREAD_DETACHED);

    }

   

    _ThreadJoin(ptcb, ppvRetValAddr);   /*  合并                        */

   

    __KERNEL_EXIT();                       /*  退出内核                    */

   

    return  (ERROR_NONE);

}

 

2.2 实现机制

在Linux下如果在调用pthread_join前线程已经退出,则返回正常值。在中间件移植过程中针对pthread_join的测试用例会可能出现问题,此时如果线程结束后调用pthread_join在SylixOS下会出现问题,而在Linux是正常,需要屏蔽该类型的用例。


这篇关于SylixOS pthread_join退出的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1145444

相关文章

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Mybatis Plus Join使用方法示例详解

《MybatisPlusJoin使用方法示例详解》:本文主要介绍MybatisPlusJoin使用方法示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录1、pom文件2、yaml配置文件3、分页插件4、示例代码:5、测试代码6、和PageHelper结合6

java String.join()方法实例详解

《javaString.join()方法实例详解》String.join()是Java提供的一个实用方法,用于将多个字符串按照指定的分隔符连接成一个字符串,这一方法是Java8中引入的,极大地简化了... 目录bVARxMJava String.join() 方法详解1. 方法定义2. 基本用法2.1 拼接

redis在spring boot中异常退出的问题解决方案

《redis在springboot中异常退出的问题解决方案》:本文主要介绍redis在springboot中异常退出的问题解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴... 目录问题:解决 问题根源️ 解决方案1. 异步处理 + 提前ACK(关键步骤)2. 调整Redis消费者组

MySQL 多表连接操作方法(INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN)

《MySQL多表连接操作方法(INNERJOIN、LEFTJOIN、RIGHTJOIN、FULLOUTERJOIN)》多表连接是一种将两个或多个表中的数据组合在一起的SQL操作,通过连接,... 目录一、 什么是多表连接?二、 mysql 支持的连接类型三、 多表连接的语法四、实战示例 数据准备五、连接的性

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

java String.join()的使用小结

《javaString.join()的使用小结》String.join()是Java8引入的一个实用方法,用于将多个字符串按照指定分隔符连接成一个字符串,本文主要介绍了javaString.join... 目录1. 方法定义2. 基本用法2.1 拼接多个字符串2.2 拼接集合中的字符串3. 使用场景和示例3

数据库使用之union、union all、各种join的用法区别解析

《数据库使用之union、unionall、各种join的用法区别解析》:本文主要介绍SQL中的Union和UnionAll的区别,包括去重与否以及使用时的注意事项,还详细解释了Join关键字,... 目录一、Union 和Union All1、区别:2、注意点:3、具体举例二、Join关键字的区别&php

MySQL学习笔记-join语句类型

join从句的类型:内链接(inner) 全外连接(full outer) 左外连接(left outer) 右外连接(right outer) 交叉链接(cross) 连接条件:使用ON设定连接条件,也可以用WHERE代替 · ON:设定连接条件 · WHERE:进行结果集记录的过滤 一,内连接inner join:  内连接是返回左表及右表符合连接条件的记录,在MySQL中JO

SpringBoot登录退出|苍穹外卖登录退出分析

文章目录 概要整体流程注意事项一、拦截路径二、token三、注册防止用户重复提交 苍穹外卖登录退出分析注意解决JWT退出后依然有效的问题 概要 结合Spring Boot和Vue3实现安全的用户登录和退出功能,并使用拦截器、JWT和Redis缓存来提高系统的安全性和性能。 整体流程 注意事项 一、拦截路径 像登录页面的路径就不要拦截了,否则都不能登录了 例如: