此伪代码在多个线程中并发运行会导致死锁:
Resource res1 = pool.get();
...
Resource res2 = pool.get();
...
pool.release(res2);
pool.release(res1);
这是预期的行为吗? (我想是的)
如果池的大小是线程数的两倍,似乎不会发生死锁 - 这个语句是否正确?
计算机科学中存在这种僵局的“科学”名称吗?会很感激一些链接。
由于
答案 0 :(得分:1)
假设您有两个线程和两个资源。
线程A执行res1 = pool.get()
并获取一个资源。线程B执行res1 = pool.get()
并获取一个资源。现在池已经耗尽,因此两个线程都不能完成res2 = pool.get()
。
如果你有一个备用资源(即n+1
个线程至少有n
个资源),问题就会消失,因为在这种情况下,一个线程可以保证获得两个资源,完成,从而释放足够的资源供其他线程使用。增加资源数量可以改善并行性;拥有两倍于线程的资源,每个线程都可以不受阻塞地获取资源,因此所有线程都可以并行执行。
AFAIK这简称为“死锁”,因为它本质上是这种现象的教科书范例。这两个任务现在正在等待相互释放以释放必要的资源。