【发布时间】:2010-05-12 18:57:20
【问题描述】:
我对线程有点陌生,所以你必须原谅这个问题的幼稚。
pthread_join 是如何实现的,它如何影响线程调度?
我总是想象pthread_join 是用一个while 循环来实现的,它只是让调用线程让步,直到目标线程完成。像这样(非常近似的伪代码):
这是一个准确的描述,还是我过度简化了这个过程?
干杯!
【问题讨论】:
标签: linux multithreading pthreads scheduling
我对线程有点陌生,所以你必须原谅这个问题的幼稚。
pthread_join 是如何实现的,它如何影响线程调度?
我总是想象pthread_join 是用一个while 循环来实现的,它只是让调用线程让步,直到目标线程完成。像这样(非常近似的伪代码):
这是一个准确的描述,还是我过度简化了这个过程?
干杯!
【问题讨论】:
标签: linux multithreading pthreads scheduling
pthread_join 可能在内部实现为等待线程退出时触发的信号量,无论是在调用 pthread_exit 时还是在其主函数退出时。
无论如何,glibc 的源代码是可用的,尝试 google 代码搜索(我在那里看到了一些信息丰富的东西)
【讨论】:
是的,这是一般的想法。有关特定实现的详细信息,请查看 glibc。
【讨论】:
线程通常有一个与之关联的小结构,即线程上下文。该结构可以填充使线程“工作”所需的所有数据。
例如,数据结构的根需要访问该线程的线程特定键,并在它被关闭时对其进行迭代以清理它们。
该结构中通常有一个类似互斥锁的锁,对于不同的部分可能不止一个。
线程上下文中可以有一个小字段,终止线程可以在其中放置其退出状态。 (pthread_exit 或线程函数返回的void *。)
线程上下文还可以指示线程的状态(尚未创建、运行、停止)。
可能有一个同步原语,例如条件变量或信号量,线程在准备好终止状态并指示它正在终止后,可以kick。
pthread_join 函数可以等待该同步原语。等待完成后,该函数可以触发对该线程的资源清理,以及提取状态。
线程在发出加入信号后继续执行。为此,它必须继续拥有带有堆栈的上下文。在那之后,系统必须解决在后台干净地停止线程的问题。
线程的用户空间实现可以将其推迟到内核。例如。一些信号可能会消失或任何表明线程已完成的信号。到那时,用户空间知道线程不可能再使用它的堆栈并且可以回收它。
在内核中,调度程序可以“吃掉”一个线程。线程可以调用调度程序中的某些函数,这些函数在清理其大部分资源后永远不会返回。它将线程标记为死线程并将上下文切换到另一个线程。线程的堆栈将永远不会被再次使用(因为该函数永远不会返回)并且可以回收,以及它的任务结构和附加到它的任何剩余的东西。
【讨论】: