0

こんにちは、スレッド内の上記のコードでは、8 ではなく 0 (tid = 0) が表示されています...理由は何でしょうか? PrintHello 関数では、threadid を出力していますが、値 8 を送信していますが、出力として 0 を出力しています

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


void *PrintHello(void *threadid)
{
   int *tid;
   tid = threadid;
   printf("Hello World! It's me, thread #%d!\n", *tid);
   pthread_exit(NULL);
}

int main(int argc, char *argv[])
{
   pthread_t thread1,thread2;
   int rc;
   int value = 8;
   int *t;
   t = &value;

   printf("In main: creating thread 1");
    rc = pthread_create(&thread1, NULL, PrintHello, (void *)t);
     if (rc)
    {
        printf("ERROR; return code from pthread_create() is %d\n", rc);
        exit(-1);
        }


   printf("In main: creating thread 2\n");
    rc = pthread_create(&thread1, NULL, PrintHello, (void *)t);
     if (rc)
    {
        printf("ERROR; return code from pthread_create() is %d\n", rc);
        exit(-1);
        }


   /* Last thing that main() should do */
   pthread_exit(NULL);
}
4

1 に答える 1

3

保持する実際のオブジェクト8は関数valueに対してローカルであるmainため、終了後にアクセスすることmainは無効です。

子スレッドがこのローカル変数にアクセスしようとする前に終了するのを待たないため、動作は未定義です。

1つの修正は、をmain使用して終了する前に子スレッドを待機させることpthread_joinです。

(2回目の呼び出しでタイプミスを犯し、代わりにpthread_create渡すつもりだったと思います。)thread2thread1

例えば

/* in main, before exiting */
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
于 2012-06-02T07:01:01.023 に答える