【发布时间】:2012-07-01 17:48:43
【问题描述】:
我遇到了一个非常奇怪的情况,我无法解释。在代码中:
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();
....
为了这个问题的目的:其他线程每 100ms 从池中获取并填充 Env 结构(包括指向 Msg 的指针)。然后它通过 FIFO 发送 Env 指针。 该线程处理 Env 并将其返回到池中。
在数十万个周期中,我会遇到断点 - 好吧,我知道如果我有一些我正在寻找的错误,那可能就是这样。 恕我直言,当我在 gdb 中查看(不踩!)Env-Msg 变量时,它不是零!!!! Printf 打印零,我输入 if 子句,但 gdb 显示“正常”值。 我可以在 5-7 分钟内重现这种情况,并且 gdb 总是显示出良好的价值? 如果这是竞速条件,当两个线程都基于超时时,如何在一个汇编程序命令中完全做到这一点?
【问题讨论】:
标签: linux multithreading gdb