死锁:资源 return 的顺序是否有任何潜在问题?
Deadlock: will order of resource return have any potential issue?
// down = acquire the resource
// up = release the resource
typedef int semaphore;
semaphore resource_1;
semaphore resource_2;
void process_A(void) {
down(&resource_1);
down(&resource_2);
use_both_resources();
up(&resource_2);
up(&resource_1);
}
如果资源 return 与它获取的顺序相同,即
void process_A(void) {
down(&resource_1);
down(&resource_2);
use_both_resources();
up(&resource_1);
up(&resource_2);
}
这会导致任何潜在的问题吗?
感谢您的任何解释!
重要的是你是否在不同的线程中以相同的顺序获取锁。
释放顺序无效;没有什么能阻止程序在第一个锁被释放后释放第二个锁,(除非你在两者之间获取新的锁,但你又回到了第一种情况;以正确的顺序获取锁。)
如果您有两个函数试图以不同的顺序获取相同的两个锁,它们可能会各自获取一个锁,并永远等待另一个锁释放它们的锁。示例代码:
down(first_lock)
down(second_lock)
运行与
同时进行
down(second_lock)
down(first_lock)
他们可以在他们中的任何一个获得第二个锁之前都获得他们的第一个锁,然后他们就会死锁。
// down = acquire the resource
// up = release the resource
typedef int semaphore;
semaphore resource_1;
semaphore resource_2;
void process_A(void) {
down(&resource_1);
down(&resource_2);
use_both_resources();
up(&resource_2);
up(&resource_1);
}
如果资源 return 与它获取的顺序相同,即
void process_A(void) {
down(&resource_1);
down(&resource_2);
use_both_resources();
up(&resource_1);
up(&resource_2);
}
这会导致任何潜在的问题吗? 感谢您的任何解释!
重要的是你是否在不同的线程中以相同的顺序获取锁。
释放顺序无效;没有什么能阻止程序在第一个锁被释放后释放第二个锁,(除非你在两者之间获取新的锁,但你又回到了第一种情况;以正确的顺序获取锁。)
如果您有两个函数试图以不同的顺序获取相同的两个锁,它们可能会各自获取一个锁,并永远等待另一个锁释放它们的锁。示例代码:
down(first_lock)
down(second_lock)
运行与
同时进行down(second_lock)
down(first_lock)
他们可以在他们中的任何一个获得第二个锁之前都获得他们的第一个锁,然后他们就会死锁。