首页 > 解决方案 > 连续两次调用 pthread_join()。在第一个线程终止之前,第二个调用甚至不应该开始吗?

问题描述

这是代码(改编自www.cs.cmu.edu):

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

 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);
      printf("1\n");
      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);
      sleep(5);
 }

输出是:

 Thread 1 
 Thread 2 
 1
 Thread 1 returns: 0
 Thread 2 returns: 0

前两行会立即显示。停顿后,显示最后三行。我认为 pthread_join(thread1, NULL) 会一直等到 thread1 完成,所以在显示第一行之后应该有一个暂停,并且输出应该是:

 Thread 1 
 1
 Thread 2 
 Thread 1 returns: 0
 Thread 2 returns: 0

为什么?因为 pthread_join 的手册页说:“pthread_join() 函数等待线程指定的线程终止。” 如何解释输出?我缺少的一些简单的东西。

标签: multithreadingpthreadspthread-join

解决方案


我认为 pthread_join(thread1, NULL) 会一直等到 thread1 完成

以上是正确的;它会。

所以在显示第一行之后应该有一个暂停

这部分不跟随。您开始运行两个线程,因此两个线程彼此独立(也称为“并行”)执行,并且独立于主线程正在执行的操作。这意味着两个线程将立即打印出它们的“Thread X”行,然后两个线程将在退出前等待 5 秒。同时,主线程将等待线程 1 退出大约 5 秒,然后主线程将打印“1”,然后它将等待线程 2 退出(由于线程 2 的 5 秒,这应该不会花费很长时间-延迟将与线程 1 的 5 秒延迟大约在同一时间到期)


推荐阅读