0

以下のプログラムは、GDB 7.4(MinGW32、Eclipse、Windows)で完全にランダムにハング/フリーズし続け、約5または6回の実行ごとに推定します。これは、Eclipseのデバッグボタンをマッシュしてから、終了していないデバッグインスタンスをチェックすることで最も簡単に見つかります。もちろん、普通の人のように実行することで同じことを行うことができ、すぐに同じ結果が得られる可能性があります。

GDBに接続されていない場合、サンプルがフリーズすることはありません。これまで。また、VC ++ Expressで同じ問題を明らかにすることもできませんでした(これは別のサンプルでしたが、実際にはまったく同じアイデアでした)。

これは主に、スレッドの作成、スレッドの削除、およびプログラムの終了に関連しています。また、mainは終了コードとして-1を返しますが、プログラムがフリーズしない場合は常にGDBに接続すると、コード0で終了することにも注意してください。

もう1つの興味深い事実は、「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;
}

何がこれを引き起こしていると思いますか、そしてもっと重要なことに、どうすれば修正できますか?

4

1 に答える 1