[RTT例程练习] 1.7 优先级翻转之优先级继承
来源:互联网 发布:网络缩写英文字母 编辑:程序博客网 时间:2024/06/05 10:16
RTT 的mutex 实现了优先级继承算法,可用其来解决优先级反转的问题。
还是来自官网:
thread2和worker线程虽然优先级比thread1要高,但是这两个线程均在进程开始出就执行了延时函数,于是轮到 thread1 执行,然后 thread1获得互斥量,thread2延时结束后,虽然它的优先级高于thread1,但是它所需的互斥量被thread1占有了,它无法获得所需的互斥量以便继续运行。在此时,系统的优先级继承算法也会起作用,将thread1的优先级提升到与thread2一致,验证方法是在thread1 release互斥量之前插入tid2->currentpriority 是否等于 tid1->currentpriority的判断语句,当然此时的结果是相等的。当 thread1 优先级被提升到和 thread2 一样后,worker 线程优先级因为低于 thread1 的优先级而不再能够抢占 thread1, 从而保证避免优先级反转现象发生。
所以说,优先级反转的问题可以通过优先级继承来解决,在RT-Thread 的 mutex 中实现了优先级继承算法。
程序:
#include <rtthread.h>static rt_mutex_t mutex = RT_NULL;static rt_uint8_t t1_count, t2_count, worker_count;static rt_thread_t t1, t2, worker;static void thread1_entry(void *parameter){ rt_err_t result; result = rt_mutex_take(mutex, RT_WAITING_FOREVER); rt_kprintf("thread1: got mutex \n"); if (result != RT_EOK) return; for (t1_count = 0; t1_count < 5; t1_count++) { rt_kprintf("thread1: count: %d\n", t1_count); } //if (t2->currentpriority != t1->currentpriority) { rt_kprintf("thread1: released mutex \n"); rt_mutex_release(mutex); }}static void thread2_entry(void *parameter){ rt_err_t result; rt_thread_delay(5); result = rt_mutex_take(mutex, RT_WAITING_FOREVER); rt_kprintf("thread2: got mutex\n "); for (t2_count=0; t2_count<5; t2_count++) { rt_kprintf("thread2: count: %d\n", t2_count); }}static void worker_thread_entry(void *parameter){ rt_thread_delay(5); for (worker_count = 0; worker_count < 5; worker_count++) { rt_kprintf("worker: count: %d\n", worker_count); rt_thread_delay(5); }}int rt_application_init(){ mutex = rt_mutex_create("mutex", RT_IPC_FLAG_FIFO); if (mutex == RT_NULL) { return 0; } t1_count = t2_count = 0; t1 = rt_thread_create("t1", thread1_entry, RT_NULL, 512, 7, 10); if (t1 != RT_NULL) rt_thread_startup(t1); t2 = rt_thread_create("t2", thread2_entry, RT_NULL, 512, 5, 10); if (t2 != RT_NULL) rt_thread_startup(t2); worker = rt_thread_create("worker", worker_thread_entry, RT_NULL, 512, 6, 10); if (worker != RT_NULL) rt_thread_startup(worker); return 0;}/*@}*/
输出结果:
thread1: got mutexthread1:count: 0thread1:count: 1thread1:count: 2thread1:count: 3thread1:count: 4thread1: released mutexthread2: got mutexthread2: count: 0thread2: count: 1thread2: count: 2thread2: count: 3thread2: count: 4worker:count: 0worker:count: 1worker:count: 2worker:count: 3worker:count: 4
thread1 再取得互斥信号量之后,其优先级就变为比thread2 高,便不会发生优先级反转的现象了。
- [RTT例程练习] 1.7 优先级翻转之优先级继承
- [RTT例程练习] 1.4 线程优先级抢占
- [RTT例程练习] 1.5 优先级相同线程轮转调度
- [RTT例程练习] 1.6 线程优先级反转原理
- 优先级翻转与优先级继承
- 优先级翻转与优先级继承
- 优先级翻转与优先级继承
- 优先级翻转与优先级继承
- 优先级翻转与优先级继承
- 优先级翻转
- 优先级翻转
- 优先级翻转
- 优先级继承
- [RTT例程练习] 总目录
- java例程练习(多线程[线程的优先级等等])
- 优先级翻转问题
- 优先级翻转(转)
- Vxworks 中的 优先级翻转
- 颜色渐变基本算法
- 修改监听端口后oem的操作
- 可变类型开放数组Demo
- 采用execSQL()和rawQuery()方法完成数据的添删改查
- 如何让虚拟目录里面的webconfig不继承网站的设置
- [RTT例程练习] 1.7 优先级翻转之优先级继承
- 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点
- 对话框中WaitForSingleObject等待线程退出导致程序阻塞的原因及解决
- BlowFish算法加密解密
- 诉说一个屌丝20多年的点点滴滴
- shell中sed的使用
- spring和BlazeDS 集成配置后台
- VIM下,在文件及目录中查找字符串的方法 (vimgrep)
- poj 1252 Euro Efficiency(多次完全背包)