这是什么时候发生的?线程在关键部分暂停

时间:2010-03-02 23:58:13

标签: multithreading language-agnostic

我只是想知道,如果一个帖子在一个关键部分,是否可以被抢占?

  • 主题A :输入CR
  • 主题A :暂停
  • 主题B :想要输入CR但不能,因为主题A 有锁

如果主题A 被抢占,并且互斥锁被主题A 所困,那么可以做些什么?

2 个答案:

答案 0 :(得分:6)

假设线程A被更高优先级的线程C抢占。现在假设线程B实际上比C更高优先级。如果B变为可运行,则有一个典型的优先级倒置情况;线程B(高优先级)卡在等待线程A持有的资源(低优先级)。对此的一种解决方法称为优先级继承。

使用优先级继承,当B阻塞A所持有的资源(临界区)时,线程A暂时'继承'线程B的优先级。这允许A抢占那个烦人的中优先级线程C,并且当A完成资源后,A回到原来的优先级。这可以说是B的方式,可以说是消除了死锁。

答案 1 :(得分:5)

当然可以被抢先一步。否则其他线程如何尝试进入该关键部分,如果允许在进程中运行的唯一线程是拥有关键部分的线程?

示例中的线程B将一直等到线程A被重新安排并完成crtical部分。这里不足为奇。如果在关键部分中,线程A也等待thead B拥有的互斥锁,则必须通过修改逻辑解决死锁问题。