我有一个我无法解释的非常奇怪的情况。在代码中:
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并将其返回池中。
一旦进入成千上万个周期,我就会陷入断点 - 好吧,我明白可能是因为我有一些错误,我正在寻找。 什么不能恕我直言,当我在env-Msg变量上查看gdb(没有踩踏!)时,它不是零! Printf打印为零,我输入if子句,但gdb显示“正常”值。 我可以在5-7分钟内重现一次这种情况并且gdb始终显示出良好的价值? 如果这是竞争条件,当两个线程都基于超时时,如何在一个汇编程序命令中完全实现这一点?
答案 0 :(得分:0)
gdb是否立即停止所有线程
没有。在Linux上,一旦一个线程收到SIGTRAP
(由于断点触发),GDB必须停止所有其他线程(通过遍历GDB知道的线程列表,并向每个线程发送SIGSTOP
)。 / p>
如果Env
在两个线程之间共享,Env->Msg
很可能在评估NULL
条件时为if
,但变为非NULL
当GDB给你提示时。