7

私は糸脱毛に不慣れです。ここで、pthread_join(thread1、NULL)にコメントすると、出力に次のようになることがあります。

    Thread2
    Thread1
    Thread1

Thread1トレースが2回来る理由と、pthread_joinの正確な機能を理解できません。

また、初心者向けのスレッドの概念に関するチュートリアルを参照してください。

    void *print_message_function( void *ptr );
    main()
    {
            pthread_t thread1, thread2;
            char *message1 = "Thread 1";
            char *message2 = "Thread 2";
            int  iret1, iret2;
            iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) message1);
            iret2 = pthread_create( &thread2, NULL, print_message_function, (void*) message2);
            pthread_join( thread1, NULL);

            pthread_join( thread2, NULL); 

            printf("Thread 1 returns: %d\n",iret1);
            printf("Thread 2 returns: %d\n",iret2);
            exit(0);
    }

    void *print_message_function( void *ptr )
    {
            char *message;
            message = (char *) ptr;
            printf("%s \n", message);
    }
4

2 に答える 2

1

おそらく、出力バッファが正しくフラッシュされていません。マルチスレッドを実行して出力をファイルにパイプするときに、非常によく似た問題が発生しました。出力が2回表示されることがあります。この行をメイン関数に追加してみてください。

setvbuf(stdout, NULL, _IONBF, 0);

これにより、書き込みのたびに出力バッファが強制的にフラッシュされます。

于 2012-04-26T02:05:04.990 に答える
1

これらの結果が得られた場合、まず最初に次のことを行います。

1)以下の行の代わりに、

iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) message1);

iret2 = pthread_create( &thread2, NULL, print_message_function, (void*) message2);
pthread_join( thread1, NULL);

pthread_join( thread2, NULL); 

に置き換えて、

iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) message1);

pthread_join( thread1, NULL);
iret2 = pthread_create( &thread2, NULL, print_message_function, (void*) message2);

pthread_join( thread2, NULL); 

結果を確認します。

2)スレッド関数内で、pthread_exit( "Exit");を呼び出す必要があります。これは、スレッド関数を終了するための適切な方法です。関数の最後にそれを行います。

void *print_message_function( void *ptr )
{
        char *message;
        message = (char *) ptr;
        printf("%s \n", message);
        pthread_exit("Exit"); 
    }

この方法で実行している場合、理想的には問題に直面しないはずです。いずれの場合も、私はあなたがを使用してあなたのプログラムをコンパイルしていると仮定していますgcc -D_REENTRANT -o threadex threadex.c -lpthread

これは最終的な解決策ではありません。うまくいけば、一度に両方のスレッドを開始する次のステップに進むことができます。

これらの変更を組み込んだ後、フィードバックを共有してください。

于 2012-04-26T02:31:13.610 に答える