我已经阅读了很多关于优先级反转的帖子,但我仍然无法澄清我对某些部分的理解。如果有人能对我的问题有所了解,我会很高兴。
我们先描述一下情况。我有一个伪代码,这是不言自明的。
我有一个共享资源 - int t; 这是将由三个线程执行的函数 - 低优先级任务 p1、中优先级任务 p2、高优先级任务 p3。
/**Shared resource **/
int t;
/** Function that will be executed by three threads **/
void func()
{
printf("hello..world"); /** line number 11**/
mutex_lock(&lock); /** line number 12**/
{ /** line number 13**/
for(int i = 0; i<=100; i++) /** line number 14**/
{ /** line number 15**/
t++; /** line number 16**/
} /** line number 17**/
} /** line number 18**/
mutex_unlock(&lock); /** line number 19**/
} /** line number 20**/
假设 p1(low p).. 开始执行 func()。现在让我们说它在第 13 行。在互斥锁之后。意味着同时让我们说 p3 ..开始运行。现在,p3 将被阻塞,因为 p1 在临界区。因此,p3 进入阻塞状态。
场景 - p1 - 在临界区内部 - 处于运行状态。p3 - 阻塞状态。
现在,假设 p2 开始运行。由于 p2 处于运行状态,由于 p2 处于临界区,它也会被 p1 阻塞。那么这里怎么会发生优先级反转呢?之后我失去了理解,请解释我..
我下面的理解是否正确?如果不是,请更正。p2任务发生优先级反转时应该是什么情况?我知道当 p2 开始运行时会发生优先级反转。p2 完成后,p1 开始运行。而且 p3 永远没有机会。或者可能是在 p2 完成后,p3 运行。这使得 p3 延迟。在这种情况下,可能会发生互斥超时。
这是其中一种情况 - 我们软件中的错误。由于互斥锁超时而发生崩溃的地方。发生这种情况是因为有人说优先级倒置。这已通过将 mutex 属性设置为优先继承来解决。我试图对修复进行事后分析,但我坚持优先级反转的基本原理。我已经阅读了很多帖子 - 火星路径查找器,但我被我的问题所困扰。请在这里帮助我。