2

私はこのコードを持っています:

#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <time.h>

int number;
pthread_mutex_t  *mutex;
pthread_t *threads;

void *PrintHello(void *threadid)
{
    long tid;
    tid = (long)threadid;
    printf("Hello World! It's me, thread #%ld!\n", tid);
    time_t rawtime;
    struct tm * time_start;
    time ( &rawtime );
    time_start = localtime ( &rawtime );
    printf ( "The number %ld thread is created at time %s  \n",tid, asctime     (time_start));
    pthread_exit(NULL);
}

int main(int argc, char *argv[])
{
    int i,rc;

    printf("give threads");
    scanf("%d",&number);
    mutex = calloc( number, sizeof(*mutex));
    threads = calloc(number, sizeof(*threads));

    for (i = 0; i < number;i++) {
        pthread_mutex_init( &mutex[i],NULL);
    }

    for(i=0; i<number; i++){
        printf("In main: creating thread %d\n", i);
        rc = pthread_create(&threads[i], NULL, PrintHello, (void *)i);
        if (rc){
            printf("ERROR; return code from pthread_create() is %d\n", rc);
            exit(-1);
        }
    }

    return 0;
}

このコードの目的は、作成するスレッドの数をユーザーに尋ねることです。スレッドの作成後、スレッド自体が、スレッドの数とスレッドが作成された時刻を示す 2 つのメッセージを出力します。作成した。

問題は、メインの内部ではメッセージ"In main: creating thread"が表示されますが、スレッド内のメッセージは表示されないことがあります。

たとえば、3 つのスレッドを作成し、1 つのスレッドのみがメッセージを表示し、そのスレッドも作成された時刻を表示しません。コードに問題があるかどうかはわかりません。

4

2 に答える 2

11

根本原因:
子スレッドがタスクを 完了するmain()機会を得る前に終了します。

解決策:すべてのスレッドが作業を完了するまで、 が
確実に待機するようにする必要があります。 以下を使用する必要があります。 main()

pthread_join()

この機能を実現します。から戻る前に、次を追加しますmain()

for(i=0; i<number; i++)
{
    pthread_join(threads[i], NULL);
}

その他の問題:

  • メモリを動的に割り当てますが、割り当てを解除することはありません。ただし、プログラムが戻ると、OS はメモリを解放します。明示的に行うことをお勧めします。
  • ミューテックスを作成しましたが、使用も割り当て解除もしていません。しかし、それは進行中のコードのようです。
于 2013-01-05T13:07:33.797 に答える
3

return fromは、プロセス全体を終了main()する を呼び出すのと同じです。別の回答がアドバイスするように、メイン以外のスレッドごとに待機するか、最後に呼び出すことができますexit(...)。最初のスレッドは終了しますが、他のスレッドは引き続き実行されます。pthread_join()pthread_exit(NULL)main()

于 2013-01-05T13:11:37.780 に答える