2012-10-21 38 views
2

这个伪码多线程并发运行导致死锁:资源池僵局

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

那是一个预期的行为? (我猜是这样)

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

计算机科学中存在这种僵​​局的“科学”名称吗?将欣赏一些链接。

谢谢

回答

1

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

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

问题就没有了,如果你有一个备用的资源(即至少n+1资源n线程),因为在这种情况下,一个线程可以保证它们获得两种资源,光洁度,从而为其他线程释放足够的资源使用。增加资源数量可以提高并行性;资源的数量是线程的两倍,每个线程都可以在没有阻塞的情况下获取资源,因此所有线程都可以并行执行。

AFAIK这简直叫做“死锁”,因为它本质上是一个教科书中的现象例子。两项任务现在正在彼此等待释放必要的资源。

+0

感谢n + 1的线索:) –