我有一个非常奇怪的情况,我无法解释。在代码中:
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结构(包括指向消息的指针)。然后,它通过FIFO发送环境指针。此线程处理Env并将其返回到池。
在几十万个周期中,我会遇到一次断点--嗯,我知道这可能是因为我有一些bug,而这正是我正在寻找的。当我在gdb中查看(没有步进)时,什么都不能是IMHO!在Env-Msg变量上,它不是零!Printf输出0,我输入if子句,但gdb显示“正常”值。我可以在5-7分钟内重现一次情况,并且gdb总是显示良好的值?如果这是竞争条件,当两个线程都基于超时时,这怎么可能在一个汇编程序命令中呢?
发布于 2012-07-02 13:05:26
做gdb会立即停止所有线程
不是的。在Linux上,一旦一个线程收到SIGTRAP (由于断点触发),GDB就必须停止所有其他线程(通过迭代GDB知道的线程列表,并向每个线程发送SIGSTOP )。
如果Env在两个线程之间共享,那么Env->Msg很可能在计算if条件时为NULL,但在GDB给出提示时变为非NULL。
https://stackoverflow.com/questions/11284317
复制相似问题