関数への「最後の」呼び出し中にパラメーターを保存するための追加のコードを提供しないと、同じ値で呼び出されたか、別の値で呼び出されたかを検出する機会がまったくありません。
xの「現在の」値はスタックにのみ存在するため、関数呼び出しが終了すると完全に失われます。
マルチスレッド化以前の時代には、関数の最後の実行中に静的変数を使用して x の値をキャッシュするだけで、func
(ほぼ) 問題を解決できたはずです。
void fun (int x) {
static int old_value = VALUE_INVALID;
if(x != old_value)
printf("VALUE OF X IS DIFFERENT THAN PREVIOUS CALL \n");
old_value = x;
}
このアプローチにまだ残っている唯一の問題は、再入可能性です。つまりfunc
、シグナル ハンドラーで呼び出された場合、キャッシュされた値が台無しになる可能性があります。
マルチスレッドアプリケーションで実行している場合、このアプローチを使用するときに何らかのロック メカニズムを追加で提供する必要があります。
関数の「最後の」呼び出しと「実行中」の値が正確に何を意味するのかを明確にする必要があるため、おそらくこのシナリオではめちゃくちゃになるでしょう。
現在の正しい値は、スレッド B の前に func に入ってまだ実行中のスレッド A の値ですか、それとも B の後に入って func の実行が既に終了しているスレッド B の値ですか?