説明できない非常に奇妙な状況があります。コード内:
Env = Global.Queue2Ctrl.FIFO(100);//Wait for a msg for 100ms
if (Env == 0) continue; //Timeout
printf("i=%d %x\n",++i, (Env->Msg));
if (!Env->Msg)
BreakP();
....
この問題の目的: 100 ミリ秒ごとに他のスレッドがプールから取得し、Env 構造体 (メッセージへのポインターを含む) を埋めます。次に、FIFO 経由で Env ポインタを送信します。このスレッドは Env を処理し、それをプールに返します。
数十万サイクルに一度、私はブレークポイントに落ちます - まあ、私が探しているバグがあるかもしれないことを理解しています。Env-Msg変数でgdbを(ステップなしで!)見ると、IT IS NOT ZERO !!!! Printf はゼロを出力し、if 句を入力しますが、gdb は「通常の」値を示します。5〜7分に1回状況を再現でき、常にgdbは適切な値を示しますか? これが競合状態である場合、両方のスレッドがタイムアウトに基づいている場合、これが 1 つのアセンブラー コマンドでどのように正確になるのでしょうか?