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是正常,需要屏蔽该类型的用例。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值