0

您好,线程中的上述代码显示 0 (tid = 0) 而不是 8 ...可能是什么原因?在 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的本地对象,因此在退出后访问是无效的。mainmain

在尝试访问此局部变量之前,您无需等待子线程完成,因此行为未定义。

一种解决方法是让您main在退出 using 之前等待它的子线程pthread_join

(我假设您在第二次调用时打错了字,pthread_create并且打算通过thread2而不是thread1。)

例如

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