1

SO とhttp://en.wikipedia.org/wiki/Reentrancy_(computing)のリエントラントに関するスレッドを 5 つ読みました。

再入可能関数のアイデアが得られるかもしれません。しかし、wiki サイトで例を読んだとき、私は本当に混乱しました。

最初の例:

int t;

void swap(int *x, int *y)
{
 t = *x;
 *x = *y;
 // hardware interrupt might invoke isr() here!
 *y = t;
}

void isr()
{
 int x = 1, y = 2;
 swap(&x, &y);
}

サイトが説明したように: 「それでも再入可能には失敗します。これは、すでに swap() を実行しているスレッドと同じコンテキストで isr() が呼び出された場合、引き続き問題を引き起こします。」 => ここでどのような種類の問題が発生する可能性がありますか? ? スワップ結果が正しくない? それとも t 変数の値が変更されていますか?

そして、最初の例を改善した 2 番目の例:

int t;

void swap(int *x, int *y)
{
 int s;

 s = t; // save global variable
 t = *x;
 *x = *y;
 // hardware interrupt might invoke isr() here!
 *y = t;
 t = s; // restore global variable
}

void isr()
{
 int x = 1, y = 2;
 swap(&x, &y);
}

これは最初のものをどのように改善しますか? これは、swap() 関数内で変数 t が変更されないということですか?

4

1 に答える 1