小编vis*_*oel的帖子

如果可以动态获取锁,则强加锁排序并不能保证防止死锁。这是什么意思?

无法理解以下摘自Galvin 第 9 版第 7 章死锁第 326 页的文本

如果可以动态获取锁,则强加锁排序并不能保证防止死锁。例如,假设我们有一个在两个账户之间转移资金的功能。为了防止竞争条件,每个帐户都有一个关联的互斥锁,该锁是从 get lock() 函数获得的,如下面的程序所示:

void transaction(Account from, Account to, double amount)
{ 
       mutex lock1, lock2; 
       lock1 = get lock(from); 
       lock2 = get lock(to);

       acquire(lock1);
          acquire(lock2);
            withdraw(from, amount);
            deposit(to, amount);
          release(lock2);
       release(lock1);
}
Run Code Online (Sandbox Code Playgroud)

如果两个线程同时调用 transaction() 函数,转换不同的帐户,则可能出现死锁。也就是说,一个线程可能会调用

transaction(checking account, savings account, 25);
Run Code Online (Sandbox Code Playgroud)

另一个可能会调用

transaction(savings account, checking account, 50);
Run Code Online (Sandbox Code Playgroud)

有人可以帮我理解这里的意思吗?

multithreading operating-system deadlock

2
推荐指数
1
解决办法
823
查看次数