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

bob*_*obo 3 language-agnostic multithreading

我只是想知道,如果一个线程处于关键部分,它是否可以被抢占?

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

如果线程A抢占,并且互斥锁被线程A卡住,那么可以做些什么呢?

Jus*_*eff 6

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

与优先级继承,当B块由A(临界区)举行的资源,线程A暂时"继承"线程B的优先级这允许抢占的是中恼人的优先级的线程C,当A与实现资源,A回到原来的优先级.这可以说是A出了B的方式,消除了死锁.


GSe*_*erg 5

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

您的示例中的线程B将等待,直到重新安排线程A并完成crtical部分.这里不足为奇.如果线程A在关键部分中也等待thead B拥有的互斥锁,那么它就是一个死锁,你必须通过修改你的逻辑来解决它.