【问题标题】:How exactly a child thread returns from its pthread_create()'s start function?子线程如何从其 pthread_create() 的启动函数返回?
【发布时间】:2021-01-07 05:05:25
【问题描述】:

我目前正在以使用Solaris操作系统的POSIX线程库课程为例,我从我的大学老师那里得到了这个问题:

当一个子线程遇到返回语句时,究竟会发生什么? (我回答说在这种情况下会隐式调用 pthread_exit,但我的回答并没有让他满意,所以他问了下面的另一个)。

如果这个函数不是这个线程的启动函数会发生什么,即 OC 如何知道它必须在哪个 return 语句上返回控制权(对 pthread_exit 进行隐式调用)而在哪个不是?

我想我可以将其解释为:“当线程偶然发现返回语句时会发生什么?”

我不知道如何回答这个问题,所以非常感谢任何帮助!

附言

事实上,当我查看程序的汇编代码时,我可以看到没有对 pthread_exit 进行隐式调用:

void* print_some_lines(void* args) {

    printf("Child printing..\n");
    int i;
    for (i = 0; i < 10; ++i) {
        printf("Child's line number %d \n", i);
    }
    printf("Child done printing\n");
    return NULL;   
} 

return NULL; 
} 

等于

mov eax, 0   
leave
ret

在装配中

【问题讨论】:

  • 在新线程跳转到用户提供的线程函数起始地址之前,操作系统通常会使用存根函数的地址建立一个新的线程堆栈。当/如果线程进行顶级返回时,它会执行包含 pthread_exit 调用的存根。
  • @MartinJames 您能否详细说明这些与线程相关的存根?或者你可以推荐一些我可以阅读的文献?
  • 如果您的讲师在您的课程中提出问题,那么他们可能希望从讲座和/或课程材料中获得答案,或者至少基于课程材料,如果他们期望的话一个答案。那么那些是怎么说的呢?
  • 无论如何,Pthreads 规范都没有解决这个问题,所以这是一个实现问题。它在 Solaris 上的完成方式不一定是它在 Linux 上的完成方式,这不一定是它在其他系统上的完成方式。
  • @JohnBollinger 好吧,问题在于它是如何在 Solaris 上完成的,因为我以 Solaris 操作系统为例。我们的讲座没有说任何具体的东西,它们只是关于一般的想法。我想任何找到具体信息都是学生的责任。由于我找不到有关此主题的任何内容,因此我认为有人可以在这里帮助我。

标签: unix operating-system pthreads solaris


【解决方案1】:

当一个子线程遇到返回语句时,究竟会发生什么? (我回答说在这种情况下会隐式调用 pthread_exit,但我的回答并没有让他满意,所以他问了下面的另一个)。

正如我在 cmets 中所写的那样,Pthreads 规范并没有说明这个问题,但经过一番考虑,我倾向于说唯一合理的答案是函数将控制权返回给它的调用者,就像任何其他时间执行return。那么,我的看法是,您对问题的思考过度,这就是您找不到答案的原因。

请注意,Pthreads 不会将“子线程”区分为一个类别——一旦启动,线程都处于平等地位。甚至是程序的初始线程。例如,任何线程都可以加入任何其他可连接线程,包括程序的初始线程,如果该线程碰巧通过调用pthread_exit() 终止。此外,线程的启动函数也可以直接调用,并且可以与pthread_create() 使用它们的任何函数分开编译,因此Pthreads 不能依赖于它们的编译方式有什么特别之处。

因此,在 C 语言级别上,线程启动函数(除非您计算它们所需的原型)以及它们调用的函数并没有什么特别之处。所有这些函数都具有普通的 C 语义,包括它们执行的 return 语句的普通语义,就好像它们运行的​​线程是程序中的唯一线程一样。当对线程的 start 函数的初始调用返回给其调用者时,确实会调用特殊语义,但这是 Pthreads 实现的责任,超出了 C 语言的范围。

我什至认为,即使从初始调用返回到线程的 start 函数隐式调用 pthread_exit(),也确实有点不对劲。当然,其他线程可观察到的结果就像调用了 pthread_exit(NULL),但最好将其与 Pthreads 实现本身相关联,而不是暗示 return 语句的执行具有特殊的上下文相关语义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    相关资源
    最近更新 更多