【发布时间】:2019-04-13 02:34:11
【问题描述】:
这是我不确定是否会出现问题的场景。
Foo()
{
TakeMutex()
//some critical code
GiveMutex()
}
Task A priority 5
Task B priority 1
TaskB{ Foo() }
TaskA{ Foo() }
现在在其他一些任务中,它可能会改变任务 A 和 B 的优先级。 假设任务 B 调用 Foo 并获取互斥锁。现在,当 B 拥有互斥锁时,任务 A 调用 foo 并尝试获取互斥锁。由于互斥体的优先级继承,任务 B 现在将成为任务 A 的优先级,即 5。
Task A priority 5
Task B priority 5 inherited
Now at this moment, some other task attempts to change the priority of Task
B to 8 using vTaskPrioritySet().
Task A priority 5
Task B priority 8 the set value if even? or does it stay 5 returning 8?
问题是,在任务 B 放开互斥锁后,它会返回什么优先级?它会回到原来的优先级 1 还是保持其设定值。如果相反的情况是任务 A 被更改为更低或更高的优先级值呢?这种情况是否有任何排列会导致意外行为?
【问题讨论】:
-
一个我没想过的有趣问题,也适用于 Linux。
标签: mutex freertos priority-inversion