同时处于就绪状态的线程,优先级高的先执行。

高优先级就绪时,低优先级任务让出CPU,让高优先级任务先执行。

创建两个任务函数:

//线程优先级抢占
void thread1_entry(void *parameter)
{
rt_uint32_t count = 0;
while(1)
{
for(;;count++)
{
rt_thread_delay(3*RT_TICK_PER_SECOND); //等三秒输出一次
rt_kprintf("count = %d\n",count);
}
}
}
void thread2_entry(void *parameter)
{
rt_tick_t tick;
rt_uint32_t i = 0;
for(i = 0;;i++)
{
tick = rt_tick_get();
rt_thread_delay(RT_TICK_PER_SECOND); //等疫苗输出一次
rt_kprintf("tick = %d\n",tick);
}
}

启动他们:

void rt_thread_test(void)
{
//线程抢占实验
result= rt_thread_init(&thread1,"thread1",thread1_entry,RT_NULL,thread1_stack,512,10,10);
if(result == RT_EOK)
{
rt_thread_startup(&thread1);
} if(RT_EOK == rt_thread_init(&thread2,"thread2",thread2_entry,RT_NULL,thread2_stack,512,10,10))
{
rt_thread_startup(&thread2);
}
}

因为更高的优先级,thread1率先得到执行,随后它调用延时,时间为3个系统tick,于是thread2得到执行。可以从打印结果中发现一个规律, 在第一次thread2了打印两次thread1会打印一次之后,接下来的话thread2每打印三次thread1会打印一次。对两个线程的入口程序进 行分析可以发现,在thread1 3个系统tick的延时里,thread2实际会得到三次执行机会,但显然在thread1的第一个延时内thread2第三次执行并没有执行结束,在第 三次延时结束以后,thread2本应该执行第三次打印计数的,但是由于thread1此时的延时也结束了,而其优先级相比thread2要高,所以抢占 了thread2的执行而开始执行。当thread1再次进入延时时,之前被抢占的thread2的打印得以继续,然后在经过两次1个系统tick延时和 两次打印计数后,在第三次系统tick结束后又遇到了thread1的延时结束,thread1再次抢占获得执行,所以在这次thread1打印之 前,thread2执行了三次打印计数。

线程优先级抢占实验【RT-Thread学习笔记 3】的更多相关文章

  1. 线程让出实验【RT-Thread学习笔记 4】

    API: rt_thread_yield 线程函数中调用,本线程释放MCU.如果此时有别的相同优先级的任务整处于等待状态,将获得MCU使用权. 线程让出就是给OS增加一个任务调度的机会. 创建两个线程 ...

  2. 线程之间的通信socketpair【学习笔记】【原创】

    平台信息:内核:linux3.1.0系统:android5.0平台:tiny4412 作者:庄泽彬(欢迎转载,请注明作者) 说明: 韦老师的安卓视频学习笔记 一.在一个进程中多个线程如何进行通信,主要 ...

  3. thread学习笔记--BackgroundWorker 类

    背景: 在 WinForms 中,有时要执行耗时的操作,比如统计某个磁盘分区的文件夹或者文件数目,如果分区很大或者文件过多的话,处理不好就会造成“假死”的情况,或者报“线程间操作无效”的异常,或者在该 ...

  4. Boost Thread学习笔记五

    多线程编程中还有一个重要的概念:Thread Local Store(TLS,线程局部存储),在boost中,TLS也被称作TSS,Thread Specific Storage.boost::thr ...

  5. Boost Thread学习笔记四

    barrierbarrier类的接口定义如下:  1 class barrier : private boost::noncopyable   // Exposition only 2 { 3 pub ...

  6. Boost Thread学习笔记三

    下面先对condition_impl进行简要分析.condition_impl在其构造函数中会创建两个Semaphore(信号量):m_gate.m_queue,及一个Mutex(互斥体,跟boost ...

  7. Boost Thread学习笔记二

    除了thread,boost种:boost::mutexboost::try_mutexboost::timed_mutexboost::recursive_mutexboost::recursive ...

  8. Boost Thread学习笔记

    thread自然是boost::thread库的主 角,但thread类的实现总体上是比较简单的,前面已经说过,thread只是一个跨平台的线程封装库,其中按照所使用的编译选项的不同,分别决定使用 W ...

  9. Java学习笔记-多线程-创建线程的方式

    创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...

随机推荐

  1. 【Learning Python】【第二章】Python基础类型和基础操作

    基础类型: 整型: py 3.0解决了整数溢出的问题,意味着整型不必考虑32位,64位,有无符号等问题,你写一个1亿亿亿,就是1亿亿亿,不会溢出 a = 10 ** 240 print(a) 执行以上 ...

  2. OD20

    查壳   发现没有壳          那就载入OD 在命令中在API函数下下个断点 然后程序跑起来 ,   点CHECK  断下来了 在动态链接库断下来了      我们alt+F9   回到用户界 ...

  3. js one() 方法

    js 中有个类似于bind()方法的one() 方法,one()方法的作用是执行一次,为每一个匹配元素的特定事件(像click)绑定一个一次性的事件处理函数. 事例代码如下: <script t ...

  4. CSS外边距margin上下元素重叠

    CSS外边距margin上下元素重叠 转载:http://www.gaoyouyou.com/view/77.htm 两个或多个块级盒子的垂直相邻边界会重合.结果的边界宽度是相邻边界宽度中最大的值.如 ...

  5. C#基础——系统登录功能的实现

    一般的登陆界面,都是利用用户名和密码在数据库的匹配关系,来实现登陆的跳转功能. 首先介绍用户数据表的设计. 其中ID列需要设置好增量标识,随着用户的增加,ID的值递增,避免重复. 然后是C#中对数据库 ...

  6. DSL 或者说是抽象 或者说是沉淀 ,我看到的不错的一篇文章

    作者:张浩斌 链接:https://www.zhihu.com/question/45552115/answer/99388265 来源:知乎 著作权归作者张浩斌和知乎所有.   ---------- ...

  7. iOS截屏

    - (UIImage *)captureImageFromView:(UIView *)view{ UIGraphicsBeginImageContext(view.bounds.size); CGC ...

  8. HDU 1285 确定比赛排名 (数组实现 )

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285 确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    ...

  9. javascript学习笔记全记录

          js的初步了解     1.就是用来修改样式的,修改的是行内样式.任何样式都能够修改.     2.css里面怎么写js就怎么写.     3.任何元素都能加事件:事件都要小写 js的三大 ...

  10. win7系统.LNK类型文件打开方式的修复办法

    1.首先 win+r 2.打开运行程序 3.输入: regedit 4.找到: 计算机\HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\WINDOWS\currentvers ...