资源池死锁

时间:2012-10-21 05:30:00

标签: multithreading deadlock

此伪代码在多个线程中并发运行会导致死锁:

Resource res1 = pool.get();
...
Resource res2 = pool.get();
...
pool.release(res2);
pool.release(res1);

这是预期的行为吗? (我想是的)

如果池的大小是线程数的两倍,似乎不会发生死锁 - 这个语句是否正确?

计算机科学中存在这种僵​​局的“科学”名称吗?会很感激一些链接。

由于

1 个答案:

答案 0 :(得分:1)

假设您有两个线程和两个资源。

线程A执行res1 = pool.get()并获取一个资源。线程B执行res1 = pool.get()并获取一个资源。现在池已经耗尽,因此两个线程都不能完成res2 = pool.get()

如果你有一个备用资源(即n+1个线程至少有n个资源),问题就会消失,因为在这种情况下,一个线程可以保证获得两个资源,完成,从而释放足够的资源供其他线程使用。增加资源数量可以改善并行性;拥有两倍于线程的资源,每个线程都可以不受阻塞地获取资源,因此所有线程都可以并行执行。

AFAIK这简称为“死锁”,因为它本质上是这种现象的教科书范例。这两个任务现在正在等待相互释放以释放必要的资源。