繁体   English   中英

为什么这个简单的多线程程序在 eclipse - mingw32/gdb 中冻结?

[英]Why is this simple multithreaded program freezing in eclipse - mingw32/gdb?

下面的程序在 GDB 7.4(MinGW32、Eclipse、Windows)中绝对随机地保持挂起/冻结,估计大约每 5 或 6 次运行。 通过在 eclipse 中按下调试按钮然后检查尚未终止的调试实例,可以很容易地找到它。 您当然可以通过像正常人一样运行它来做同样的事情,并且很可能很快就会得到相同的结果。

样本在未附加到 GDB 时永远不会冻结。 曾经。 我也无法在 VC++ Express 下暴露相同的问题(这是一个不同的示例,但实际上只是相同的想法)。

它主要围绕着线程创建、线程删除和程序终止。 同样值得注意的是,即使 main 返回 -1 作为退出代码,只要程序没有冻结,它就会以代码 0 退出时附加到 GDB。

另一个有趣的事实——当我取消对“Sleep(1)”调用的注释时,它会在 80% 的时间内停止挂起。 但是,当它确实冻结时,它会在打印“Return -1\n”后冻结。 所有其他终止继续返回 0(不使用 gdb 运行时除外)。

废话不多说,上代码:

#include <stdio.h>
#include <windows.h>
#include <process.h>

void __cdecl callback(void *arg)
{
    int count = 0;

    while(count < 10)
    {
        printf("Thread 2(%i): looping %i\n", (int)arg, count);
        count++;
    }

    printf("Ending thread...\n");
    _endthread();
}

int main(int argc, char *argv[])
{
    // Mingw32 on windows w/ eclipse - fix console output not showing up until the app terminates
    setvbuf(stdout, NULL, _IONBF, 0);
    setvbuf(stderr, NULL, _IONBF, 0);

    bool runMain = true;

    int runCount = 0;

    while(runMain == true)
    {
        if(runCount == 5)
        {
            printf("Thread starting... ");
            int result = _beginthread(callback, 0, (void*)5);
//          Sleep(1);

            if(result == 0)
                printf("[FAILURE]\n");
            else
                printf("[SUCCESS]\n");
        }

        printf("Thread 1: %i\n", runCount);
        runCount++;

        if(runCount == 20)
            runMain = false;
    }

    printf("Return -1\n");
    return -1;
}

您认为是什么原因造成的,更重要的是 - 我该如何解决?

没有解决办法。 GDB #17247相关的错误。

向 gdb 或您的应用程序发送 SIGCONT 信号可使其再次运行。

下次尝试运行此命令:

killall -s SIGCONT <gdb | your application process name>

要么

kill -18 <gdb pid|application pid>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM