3

を使用してスレッドを作成しましたpthread_create()。新しいスレッドが正常に作成され、制御が新しく作成されたスレッドに渡されます。ただし、メインスレッドはもう実行されていないようです。メイン スレッドは無限ループにあり、決して終了しません。以下は、コードのスニペットです。

void *start_routine(void)
{
    printf("Start routine reached!\n");
    fflush(stdout);

    printf("Pthread returning!\n");
    fflush(stdout);

    return NULL;
}

void create_thread()
{
        pthread_t newThread;

        printf("Thread create reached!!\n");
        fflush(stdout);

        /* Create the new thread */
        if((pthread_create(&newThread, NULL, start_routine , NULL)) != 0 ){
                perror("pthread_create");
                fflush(stdout);
        }

        printf("Thread create done!!\n");
        fflush(stdout);

        return;
}

出力は次のとおりです。

Thread create reached!!
Start routine reached!
Pthread returning!

「スレッド作成完了!!」が表示されない 印刷されており、プログラムはこの時点でスタックしています。

どんなポインタも役に立ちます。ありがとうございました!

4

1 に答える 1

0

の間違った署名が原因であるはずですstart_routine。エントリ ルーチンの標準シグネチャpthread_createは ですvoid *(*start_routine)(void *)。の実装ではpthread_create、 providedstart_routineが呼び出され、 for の引数を使用してstart_routine、あなたのケースでcreate_threadは value が提供されますNULL。したがって、 inpthread_createNULLを呼び出す前にスタックにプッシュされますstart_routinestart_routine、スタックは復元されませんpthread_create(正確には、によって呼び出される内部ルーチンpthread_create)start_routine終了後、スタックが予想外になり、 addressNULLに到達する可能性が高いと予想されます。これにより、プログラムがすぐに中止される可能性があります。

この問題は、引数がスタック経由で転送されるときに発生します。start_routineそれを修正するには、あなたを に修正するだけですvoid *start_routine(void* args)。また、メイン スレッドではpthread_join、生成されたスレッドが終了するのを待つように呼び出します。そうしないと、リソース リークが潜在的な問題になります。

Linux NPTL の内部作業に興味がある場合は、 http://raison.gegahost.net/pthread_create ?p=91にアクセスしてください。

于 2013-03-17T03:44:07.493 に答える