multithreading - 连续两次调用 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() 函数等待线程指定的线程终止。” 如何解释输出?我缺少的一些简单的东西。
解决方案
我认为 pthread_join(thread1, NULL) 会一直等到 thread1 完成
以上是正确的;它会。
所以在显示第一行之后应该有一个暂停
这部分不跟随。您开始运行两个线程,因此两个线程彼此独立(也称为“并行”)执行,并且独立于主线程正在执行的操作。这意味着两个线程将立即打印出它们的“Thread X”行,然后两个线程将在退出前等待 5 秒。同时,主线程将等待线程 1 退出大约 5 秒,然后主线程将打印“1”,然后它将等待线程 2 退出(由于线程 2 的 5 秒,这应该不会花费很长时间-延迟将与线程 1 的 5 秒延迟大约在同一时间到期)
推荐阅读
- python - 用 One Time Pad 破解 Python 问题
- python - 在 R 或 Python 中将非结构化数据从 pdf 解析为结构化数据
- python - 点和线串之间的最大距离
- amazon-web-services - 在 API Gateway 的访问日志中记录响应标头
- java - Java compareTo 方法失败
- javascript - Vue 应用程序未显示 Vuex 中的数据
- mysql - Azure MySQL Azure Active Directory 访问令牌
- excel - 有没有办法让两个单元格在 Excel 中相互引用?
- javascript - 请求从客户端和服务器端删除后仍然附加cookie
- flutter - Dart2,如何避免“在 null 上调用了方法 '[]'。” 在 LIST 上