问题描述
如果线程正在等待某个条件,一个将来,一个永久的倒计时锁存器(由于逻辑中的错误本应异步通知该条件,完成了将来,将锁存器计数到零等),正确的名字是什么?僵局?活锁?还有吗?
特别是,将没有出现在领带中的东西称为死锁,但实际上将某些东西阻止为活锁,这感觉是错误的,但是最好有一个足够明确的术语来将两者分开。
解决方法
在书The Art of Multiprocessor Programming的第8.2.2节中,有一个您所描述的问题,称为“丢失的唤醒”:
就像锁本来就容易遭受死锁一样,Condition对象本来就容易遭受丢失的唤醒,在这种情况下,一个或多个线程永远等待,而没有意识到等待的条件已经成立。
书中的上下文很狭窄,它专门讨论锁定时检查条件变量。但是,将它的使用扩展到任何情况都在预料到永远不会发生的事件似乎并不过分。
因此,我听说过这种类型的错误,称为“丢失通知”或“信号丢失”。
我不会称这种情况为饥饿,因为丢失的信号本身并不是线程唤醒后用来进行工作的系统资源。资源是诸如CPU时间或内存或文件句柄之类的东西,或者它可能需要的其他东西才能完成其工作。操作系统线程本身就是资源,该错误可能导致线程失效,如果丢失的唤醒错误发生在足够多的线程上,最终可能会导致饥饿。