【发布时间】: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