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 が変更されないということですか?