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

2 に答える 2

1

常に同じ順序でロックを取得することにより、デッドロックを回避できます。

アカウント番号は整数であるため、それらをロックする自然な順序があります。最小(または最大)から順になります。(そして、逆の順序でリリースします。)

何かのようなもの:

if (from < to) {
  sem_one = get_sem(from);
  sem_two = get_sem(to);
} else if (to < from) {
  sem_one = get_sem(to);
  sem_two = get_sem(from);
} else {
  // weird self transfer, deal with it
}
sem_wait(sem_one);
sem_wait(sem_two);
// process transaction
sem_post(sem_two);
sem_post(sem_one);
于 2013-01-20T13:39:30.533 に答える
0

おそらく、異なる順序でロックを取得しています。fromスレッド 1では 1 に等しく、2 に等しいとしましょうto。スレッド 2 では 2fromto等しく、1 に等しいとします。次に、次のようなものがあります。

時間 1: スレッド 1: ロック 1 スレッド 2: ロック 2

時間 2: スレッド 1: ロックできない 2、スレッド 2: ロックできない 1

デッドロック。

于 2013-01-20T13:44:17.937 に答える