0

このプログラムでデッドロックが発生する理由を知りたい

void transfer(int from, into to, double amount) {
     sem_t *sem_from, *sem_to;
     sem_from=get_sem(from); //function that obtains the semaphore from bank account argument
     sem_to=get_sem(to);
     sem_wait(sem_from);
     sem_wait(sem_to);
     withdraw(from, amount); 
     deposit(to, amount); 
     sem_post(sem_to);
     sem_post(sem_from);
}

ありがとう。

4

3 に答える 3

2

関数の 2 つのインスタンスが同時に実行されているとします。最初のインスタンスはアカウント A からアカウント B にいくらかの金額を転送していますが、2 番目のインスタンスはアカウント B からアカウント A に別の金額を転送しています。最初のインスタンスが A のロックを取得し、同時に 2 番目のインスタンスがロックを取得した場合B のロック、デッドロックが発生します。

于 2013-01-20T10:09:39.663 に答える
1

私が理解しているように、関数の複数のインスタンスが実行されている場合、関数(withdraw、deposit)のいずれかがセマフォのリセットに失敗した場合、他の関数はセマフォを取得できないため動作を停止します。

関数が完了することを保証する場合、デッドロックを回避できます。

于 2013-01-20T10:15:51.667 に答える
1

私は最初、アカウントごとに 1 つの sem があることに気づきませんでした。AraK は受け入れられた回答に値します。

提案:出金機能と入金機能のコストが高くない場合は、クリティカル セクションを定義する一意のセマフォを使用して転送を実行してください。転送は一度に 1 回だけ行われます。

sem_t *sem_tranfer; // to be created and initialized somewhere

void transfer(int from, into to, double amount) {
     sem_wait(sem_transfer);
     withdraw(from, amount); 
     deposit(to, amount); 
     sem_post(sem_transfer);
}
于 2013-01-20T10:27:21.100 に答える