首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当使用pthread_join函数时,主线程会阻塞吗?

当使用pthread_join函数时,主线程会阻塞吗?
EN

Stack Overflow用户
提问于 2022-11-01 06:51:57
回答 1查看 43关注 0票数 0

我正在写一个多线程程序。linux手册中对pthread_join的介绍是:The pthread_join() function waits for the thread specified by thread to terminate

我很好奇这个句子是否意味着主线程和子线程分别运行,但是当子线程结束时,主线程可以结束。

代码语言:javascript
运行
复制
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是如何运行子线程和主线程的吗?

代码语言:javascript
运行
复制
#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;

}
EN

Stack Overflow用户

回答已采纳

发布于 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()中被阻塞时,对其他线程的执行没有任何影响。所有正在运行、解除阻塞的线程都将并行执行,也许还会同时执行,正如前面所描述的那样。不管有多少。线程并行运行是它们的关键特性之一。

因此,如果初始线程启动了另外两个线程,然后尝试加入其中一个线程,那么这两个额外的线程很可能会“横向地”执行。如果你根本不想那样做,那么你就不需要线程了。如果您想要控制它,那么这就是同步工具的主要功能之一,例如互斥变量和条件变量。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74272446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档