我正在写一个多线程程序。linux手册中对pthread_join的介绍是:The pthread_join() function waits for the thread specified by thread to terminate
。
我很好奇这个句子是否意味着主线程和子线程分别运行,但是当子线程结束时,主线程可以结束。
Child1 thread: 0
Child1 thread: 1
...
Child1 thread: 9999
Parent thread: 0
...
Parent thread: 99
结果总是在子线程结束后,主线程后面的for循环将被执行。这是否意味着pthread_join
执行子线程,阻塞主线程,并在子线程结束时执行主线程?
但是,当我删除以下代码的注释时,即创建两个子线程时,就不会出现预期的现象。子线程1和子线程2横向运行.当子线程1和子线程2完成时,主线程pthread_join
之后的for循环开始运行。
有人能更清楚地解释pthread_join
是如何运行子线程和主线程的吗?
#define _GNU_SOURCE
#include<stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <sched.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <pthread.h>
#include "../utils/memory_utils.h"
#include "../utils/cache_utils.h"
#include "../utils/misc_utils.h"
void function(char *str){
for(int i=0;i<10000;i++){
printf("%s thread: %d\n", str, i);
}
}
int main(){
char *str = "string";
pthread_t start,start_2;
if (pthread_create(&start, NULL, (void *)function, "Child1") != 0) {
perror("pthread_create: trojan");
}
// if (pthread_create(&start_2, NULL, (void *)function, "Child2") != 0) {
// perror("pthread_create: trojan");
// }
pthread_join(start, NULL);
// pthread_join(start_2, NULL);
for(int i=0;i<100;i++){
printf("Parent thread: %d\n", i);
}
return 0;
}
发布于 2022-11-01 14:40:02
pthread_join()
相当简单。每它的文档
pthread_join()
函数等待thread
指定的线程终止。如果该线程已经终止,则pthread_join()
立即返回。
也就是说,是的,在必要和适当的时候,pthread_join()
会阻塞调用方。但是它不会影响调用者以外的任何线程,甚至连被连接的线程也不会影响,并且当前运行的线程的数量与pthread_join()
的行为没有直接关系。
你问过,
这是否意味着
pthread_join
执行子线程,阻塞主线程,并在子线程结束时执行主线程?
不是的。
每次对pthread_create()
的成功调用都会启动一个与进程中的其他线程并行运行的新线程。如果系统有多个执行单元,就像现在的大多数执行单元一样,那么有些并行线程可能会在不同的执行单元上同时运行。无论有多少执行单元可用,包括只有一个执行单元,线程都将共享这些执行单元。
调度线程的执行时间是操作系统的一个功能。不需要额外的函数调用就可以实现,特别是pthread_join()
与线程的运行无关。它的任务是等待指定的线程完成运行,并可选择地提供该线程的返回值。就这样。当它完成该任务并返回时,执行pthread_join()
调用的线程将继续正常执行,就像从任何其他函数调用返回时一样。
你问我,
有人能更清楚地解释
pthread_join
是如何运行子线程和主线程的吗?
pthread_join()
不做任何一件事,除非它的返回允许调用它的线程继续进行。
当一个线程在pthread_join()
中被阻塞时,对其他线程的执行没有任何影响。所有正在运行、解除阻塞的线程都将并行执行,也许还会同时执行,正如前面所描述的那样。不管有多少。线程并行运行是它们的关键特性之一。
因此,如果初始线程启动了另外两个线程,然后尝试加入其中一个线程,那么这两个额外的线程很可能会“横向地”执行。如果你根本不想那样做,那么你就不需要线程了。如果您想要控制它,那么这就是同步工具的主要功能之一,例如互斥变量和条件变量。
https://stackoverflow.com/questions/74272446
复制相似问题