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

相关文章

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缓存来提高系统的安全性和性能。 整体流程 注意事项 一、拦截路径 像登录页面的路径就不要拦截了,否则都不能登录了 例如:

解决OAuth Token,点击退出登录报404问题

首先,认证服务器发送请求 http://auth.test.com:8085/logout?redirect_uri=http://admin.test.com:8080’ 退出后报404无法跳转到网站首页,这个时候增加一个参数redirect_uri指定退出成功后跳转的路径,因为是自定义的,所以需在认证服务器做一些处理 找到源码默认实现接口DefaultLogoutPageGeneratingF

多线程 | join方法

文章目录 1. 作用2. 用法3. 异常4. 源码为什么使用wait方法 5. 如何实现按照指定顺序执行线程6. 线程运行状态 1. 作用 在 Java 多线程中,join方法用于等待一个线程执行完毕。当一个线程调用另一个线程的join方法时,当前线程会进入等待状态,直到被调用的线程执行完毕。这使得开发者可以控制线程的执行顺序,确保某些关键线程在其他线程之前完成执行。 2. 用

SylixOS x86平台C++符号表

1.C++跨平台问题说明     在x86平台下编译C++工程过程后,运行编译好的C++共享库时出现符号表__atomic_fetch_sub_4找不到的问题,如图 1.1所示。

SylixOS write 0 字节问题

1 问题描述 在移植中间件过程中,在SylixOS调用write函数写入0字节的数据到文件中时,会导致对应的中间件测试用例失败,失败的原因是文件系统中的write函数在Linux系统和SylixOS有区别,两种实现的差别如下。 2 write函数的实现机制 2.1 SylixOS实现机制 在SylixOS下通过write 函数写数据到普通文件中时,第一步会判断写入的数据是否为0,如果是0直

SylixOS功能点介绍

1.概述     SylixOS作为一款大型的国产实时操作系统,有着众多小的功能点,本文对SylixOS功能点和部分性能点做了一个总结,具体内容如下。 2.SylixOS功能大纲     基于SylixOS的1.5.3的内核,SylixOS功能大纲如图 2.1所示。 图 2.1 SylixOS功能大纲 3.SylixOS功能大纲介绍     SylixOS

SylixOS ARM平台下内存对齐访问

1.内存对齐 1.1     内存对齐概要 现代计算机中内存空间都是按照byte划分的,从理论上讲对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 1.2     内存对齐作用和原因 各个硬件平台对存储空间的处理上有很大的不同。一些平

基于SylixOS的Telnet退出异常

1.Telnet的定义 1.1 Telnet的定义 Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。

王立平--android中让程序终止退出的解决办法 System.exit(0)

System.exit(0); System.exit(0)是将你的整个虚拟机里的内容都停掉了, 而finish()只是退出了activity,并没有退出应用,Application还是存在于内存中的,除非被系统回收。   System.exit(0)是正常退出程序, System.exit(1)或者说非0表示非正常退出程序 System.exit(sta