// 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);
}
如果资源以与获得的顺序相同的顺序返回,即
void process_A(void) {
down(&resource_1);
down(&resource_2);
use_both_resources();
up(&resource_1);
up(&resource_2);
}
这会导致任何潜在的问题。 谢谢你的解释!
答案 0 :(得分:0)
重要的是,如果你在不同的线程中以相同的顺序获取锁定。
释放顺序无效;在第一个锁被释放后,没有任何东西阻止程序释放第二个锁(除非你在两个锁之间取得新的锁,但是你在第一个情况下又回来了;以正确的顺序锁定。)
如果你有两个函数试图采用相同的两个锁,在不同的顺序中,它们可以每个获取一个锁,并等待另一个锁释放它们。示例代码:
down(first_lock)
down(second_lock)
与
同时运行down(second_lock)
down(first_lock)
他们可以在他们中的任何一个进行第二次锁定之前进行第一次锁定,然后他们就会陷入僵局。