10 一个线程的type反复横跳,RT_Object_Class_Thread问题

发布于 2020-08-14 21:11:28

调试出错结果是这样的:
(rt_object_get_type((rt_object_t)thread) == RT_Object_Class_Thread) assertion failed at function:rt_thread_detach
意思就是detach函数里面,的(rt_object_get_type((rt_object_t)thread) == RT_Object_Class_Thread)错误。
也就是这条语句执行失败:RT_ASSERT(rt_object_get_type((rt_object_t)thread) == RT_Object_Class_Thread);

下面是我写的代码:

1:rt_kprintf("%d,%s,%d,%d,%d\n",temp_t,temp_t->name,temp_t->stat,rt_object_get_type((rt_object_t)temp_t),RT_Object_Class_Thread);
2:err = rt_thread_detach(temp_t);

第一行分别输出了线程的地址,线程的名字(我起的名字叫“T3_sub0”),线程状态,通过get函数获得到的type类型值,RT_Object_Class_Thread的值,
然后detach我自己创建的线程 temp_t

我在thread.c里面rt_thread_detach函数一开始就加了如下输出了下信息:

if(rt_srtncmp(thread->name,"T3_sub0",7))
{
    rt_kprintf("%d\n",thread);
    rt_kprintf("%d\n",rt_object_get_type((rt_object_t)thread));
    rt_kprintf("%d\n",RT_Object_Class_Thread);
}

然后运行系统,得到如下输出:
1:475044,T3_sub0,3,1,1
2:475044
3:0
4:1

第一行就对应我前面写的代码,线程地址,detach函数执行前后都一样,名称一样,线程状态3,get到的type为1,RT_Object_Class_Thread也为1
从第二行开始就进入detach函数了,看到,线程地址没变,就是我传进去的线程,但是!
但是! get到的线程type变成0了????!!!!

前面你也看到了,我刚get到的值,然后就进入detach函数了,一进detach函数就马上重新get,结果从1变成0了,没有任何其他的进程切换,上下文切换,线程抢占。为真么传进来函数就变了?即使通过我也查了系统硬件定时器的超时功能函数,都没有改变线程type的操作,为什么就变了?????

我写的已经很详细了,把我的试错和思路也加进去了一些,麻烦懂的人来看看,别问一些无关痛痒的问题。谢谢

查看更多

关注者
0
被浏览
278
5 个回答
nongxiaoming
nongxiaoming 2020-08-15

一般是栈爆了或者内存写穿了才导致这个出现这种情况,可能是任务栈爆了

chenyingchun
chenyingchun 2020-08-18

这位童鞋,即使你很流弊,即使别人回答的不是你希望的,你要知道,别人没有义务去给你做解答,给你做了解答,不管回答是否正确,至少别人是希望能帮到你,你这个与人相处的态度,真的不敢恭维

vitocc
vitocc 2020-08-18

这不是锁的问题,rtt的多核锁和linux的一模一样.首先不能理解你说的自旋锁的嵌套问题.自旋锁的退出的确会唤醒所有的等待锁的核心,但是他们被唤醒后就会检查自己的票是否对应.否则还会自旋.这就保证了资源的独一访问.再来说说你这个问题.你这应该是A核心线程在退出,并进行了object的脱离,这其中执行了"object->type = 0;",当然这是在临界区里面进行的.但是B核心此时在调用detach函数,你会发现rt_thread_detach函数一进入就对类型进行了断言.此时是没有去拿那个核间锁的,所以会出现这样的问题.而不是说自选锁的问题.

以上所答依据arm的票算法,riscv我刚看了,还是用的swap,如果你的是riscv,自己对照着看一下吧.

可能有纰漏,错误和我理解的不正确.暴躁老哥轻喷.

w501229485
w501229485 2020-08-15

别沉~呀

JQRR_7669
JQRR_7669 认证专家 2020-08-15
rt_kprintf("%d,%s,%d,%d,%dn",temp_t,temp_t->name,temp_t->stat,rt_object_get_type((rt_object_t)temp_t),RT_Object_Class_Thread);

这句有问题。

线程名是没有结束符0的,直接当字符串指针使用可能会导致打印长度过长,造成打印缓存溢出,破坏其他数据。

把这句注释掉试试脱离函数中的打印是否正确。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友